Как добавить EmptySpaceItems и LayoutControlItems с одинаковой шириной в LayoutControlGroup с DevExpress? - PullRequest
1 голос
/ 08 июля 2011

ПРИМЕЧАНИЕ: Все элементы управления, описанные в этом вопросе, являются DEVEXPRESS элементами управления.Я пытаюсь программно добавить LayoutControlItems и EmptySpaceItems к LayoutControlGroup на DevExpress LayoutControl.

Требования для моего проекта требуют, чтобы у меня была панель LayoutControlGroup, которая зависит отнабор элементов фильтра, выбранных из другого элемента управления в макете.Если нет выбранных фильтров, то ни один из `LayoutControlItems не отображается.Если выбран один или несколько фильтров, я добавляю один или несколько элементов управления в группу на основе выбора.

Способ, которым я пытаюсь это сделать, следующий:

1) в конструкторе для LayoutControl я уже создал LayoutControlGroup с LayoutControlItem s.Всего их 6, и каждый LayoutControlItem содержит PanelControl, который содержит ListBoxControl

2) Когда форма инициализируется, я скрываю каждый из LayoutControlItems из LayoutControlGroup, используя *Метод 1026 *.

3) После того, как пользователь выбирает фильтр или набор фильтров, я запускаю следующий код, пытаясь восстановить элементы управления в группе слева направо.

this.layoutGroupScenarioPortfolios.BeginUpdate();

LayoutControlItem layoutControlToAdd;
LayoutControlItem lastLayoutControlItem = null;

for (int loop = 0; loop < selectedFilters.Length; loop++)
{
     layoutControlToAdd = LayoutControlItemFactoryUtil(selectedFilters[loop]);

     if (layoutControlToAdd == null)
     {
          continue;
     }

     if (loop < 1)
     {
     layoutControlToAdd.RestoreFromCustomization(this.layoutControlGroupSelectedFilters);
     }
     else
     {
          layoutControlToAdd.RestoreFromCustomization(lastLayoutControlItem, DevExpress.XtraLayout.Utils.InsertType.Right);
     }

     lastLayoutControlItem = layoutControlToAdd;
 }

 for (int loop = 0; loop < numOfEmptySpaceItemsNeeded; loop++)
 {
      layoutControlToAdd = new EmptySpaceItem(this.layoutControlGroupSelectedFilters)
      {
           Owner = this.layoutControlGroupSelectedFilters.Owner
      };

      layoutControlToAdd.RestoreFromCustomization(lastLayoutControlItem, DevExpress.XtraLayout.Utils.InsertType.Right);
      lastLayoutControlItem = layoutControlToAdd;
 }

 this.layoutControlGroupSelectedFilters.TextVisible = true;
 this.layoutGroupScenarioPortfolios.EndUpdate();

Как видно из кода, один цикл добавляет соответствующий ListControlBox в группу.Второй цикл пытается добавить элементы пустого пространства, чтобы убедиться, что элемент управления списком не занимает всю группу.К концу этого кода должно быть 6 элементов, охватывающих групповой элемент управления, каждый из которых имеет одинаковую ширину в элементе управления.

Проблема в том, что первый добавленный элемент управления занимает половину пространства группового блока, тогда как другой5 элементов в равной степени помещаются в оставшуюся половину группового блока.

В первом цикле метод RestoreFromCustomization() с одним параметром является правильным методом для использования?

1 Ответ

1 голос
/ 12 июля 2011

Я бы предложил разместить элементы управления во время выполнения. LayoutControl будет управлять LayoutControlGroups и EmptySpaceItems.

Вот код, который я написал для помещения пользовательских элементов управления в LayoutControl во время выполнения:

LayoutControlItem lastItem = null;
int RowWidth = 0;

    public void AddMyControl()
            {
                MyControl myControl = new MyControl("");
                myControl.Name = Guid.NewGuid().ToString();

                LayoutControlItem item = new LayoutControlItem();
                item.Name = Guid.NewGuid().ToString();
                item.Text = "";

                MyLayoutControl.BeginUpdate();
                //We need to determine where to insert the new item. Right or Below. If there is  
                //space on the right we insert at Right else we just add the item.
                if(lastItem == null || lastItem != null && (MyLayoutControl.Width - UserControlWidth) < RowWidth)
                {
                    MyLayoutControl.AddItem(item);
                    RowWidth = item.MinSize.Width;
                }
                else
                {
                    MyLayoutControl.AddItem(item, lastItem, DevExpress.XtraLayout.Utils.InsertType.Right);
                }
                item.Control = myControl;
                RowWidth += item.MinSize.Width;
                lastItem = item;
                item.Name = " ";
                MyLayoutControl.BestFit();
                MyLayoutControl.EndUpdate();
            }

Если вам просто нужны элементы управления слева направо, Flowlayoutpanel подойдет лучше. Иногда с LayoutControl сложно работать. В конце концов мне пришлось использовать Flowlayoutpanel, так как с ним гораздо проще работать.

...