2012-11-21 5 views
6

Я создал свой пользовательский элемент управления. Он имеет свойство, которое называется «Tab». Это свойство добавляет коллекцию элементов управления «FloorsInformation», которые наследуются от класса «DockContainerItem» до моего настраиваемого элемента управления.Добавить вспомогательные элементы управления в пользовательский элемент управления после нажатия кнопки «ОК» окна «CollectionEditor» во время разработки

My custom control properties

Теперь я хочу, чтобы добавить «FloorsInformation» управления на мой пользовательский элемент управления после нажмите кнопку «OK» в окне вкладки «CollectionEditor».

"Tabs Collection Editor" window

У меня есть метод "AddTabs" для делать это. Однако я не могу назвать это в нужном месте. Я должен вызвать метод «AddTabs» в «set accessor» свойства «Tab», но он никогда не возникает.

Я также могу вызвать этот метод из «get accessor» свойства «Tab», но вызов этого метода в «get accessor» свойства «Tab» приведет к ошибке, поскольку программа получает доступ к " get accessor "свойства« Tab ».

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))] 
[ToolboxItem(true), ToolboxBitmap(typeof(ToolboxIconResourceFinder), "FloorsGrouping.bmp")] 
[DisplayName("Floors Group")] 
[Editor("WindowsFormsControlLibrary2.FloorsGrouping, WindowsFormsControlLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=197889249da45bfc", typeof(UITypeEditor))] 
[Description("Floorssssssss")] 
[Category("Saino")] 
[DefaultProperty("Text")] 
[DesignerCategory("Component")] //Form //Designer //Empty String ("") 
public partial class FloorsGrouping : Bar 
{ 
    private Tabs tabs = new Tabs(); 

    public FloorsGrouping() 
    { 
     InitializeComponent(); 
     this.AutoHide = true; 
    } 

    [Category("Data")] 
    [DisplayName("Tabs")] 
    [Description("Tabsssssssssssss")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [Editor(typeof(ItemsCollectionEditor), typeof(UITypeEditor))] 
    public Tabs Tab 
    { 
     get 
     { 
      //AddTabs(); 
      return tabs; 
     } 
     //set 
     //{ 
      //AddTabs(); 
     //} 
    } 

    public void AddTabs() 
    { 
     foreach (DockContainerItem dciItem in Tab) 
     { 
      if (!Parent.Controls.ContainsKey(dciItem.Name)) 
      { 
       Items.Add(dciItem); 
      } 
     } 
    } 
} 

[DisplayName("Floors Information")] 
[Description("Floors Informationnnnnnnnnnnnnnnn")] 
[DefaultProperty("Text")] 
[DesignerCategory("Component")] 
[ToolboxItem(false)] 
public class FloorsInformation : DockContainerItem 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    private SimilarFloorsInformation similarFloorsInformation = new SimilarFloorsInformation(); 
    private AllFloorsInformation allFloorsInformation = new AllFloorsInformation(); 
    private string text = "Floors Information"; 

    public FloorsInformation() 
    { 

    } 

    [Category("Data")] 
    [DisplayName("Similar Floors Panel")] 
    [Description("Similar Floors Panellllllllllllllllllll")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public SimilarFloorsInformation SimilarFloorsInfo 
    { 
     get 
     { 
      return similarFloorsInformation; 
     } 
     set 
     { 
      similarFloorsInformation = value; 
     } 
    } 

    [Category("Data")] 
    [DisplayName("All Floors Group")] 
    [Description("All Floors Groupppppppppppppp")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public AllFloorsInformation AllFloorsInfo 
    { 
     get 
     { 
      return allFloorsInformation; 
     } 
     set 
     { 
      allFloorsInformation = value; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
} 

public class Tabs : CollectionBase 
{ 
    public FloorsInformation this[int intIndex] 
    { 
     get 
     { 
      return (FloorsInformation)InnerList[intIndex]; 
     } 
     set 
     { 
      InnerList[intIndex] = value; 
     } 
    } 

    public int Add(FloorsInformation finfItemType) 
    { 
     return InnerList.Add(finfItemType); 
    } 

    public bool Contains(FloorsInformation finfItemType) 
    { 
     return InnerList.Contains(finfItemType); 
    } 

    public void Remove(FloorsInformation finfItemType) 
    { 
     InnerList.Remove(finfItemType); 
    } 

    public void Insert(int intIndex, FloorsInformation finfItemType) 
    { 
     InnerList.Insert(intIndex, finfItemType); 
    } 

    public FloorsInformation[] GetValues() 
    { 
     FloorsInformation[] finfItemType = new FloorsInformation[InnerList.Count]; 
     InnerList.CopyTo(0, finfItemType, 0, InnerList.Count); 
     return finfItemType; 
    } 
} 

Кстати, я могу назвать этот метод «SetItems» метод отменяют класса «ItemsCollectionEditor», который наследуется от класса «CollectionEditor»; тем не менее, я не могу получить доступ к методу «AddTabs», не создавая новый экземпляр моего настраиваемого класса управления. Если я создаю новый экземпляр моего настраиваемого элемента управления, метод «AddTabs» применяет изменения в новом элементе управления моего настраиваемого элемента управления, а не в текущем добавленном настраиваемом элементе управления в WinForm.

public class ItemsCollectionEditor : CollectionEditor 
{ 
    private Type[] typItems; 

    public ItemsCollectionEditor(Type typItem) 
     : base(typItem) 
    { 
     typItems = new Type[] { typeof(FloorsInformation) }; 
    } 

    protected override Type[] CreateNewItemTypes() 
    { 
     return typItems; 
    } 

    protected override CollectionForm CreateCollectionForm() 
    { 
     CollectionForm collectionForm = base.CreateCollectionForm(); 
     collectionForm.Text = "Tabs Collection Editor"; 
     return collectionForm; 
     //return base.CreateCollectionForm(); 
    } 

    protected override object SetItems(object editValue, object[] value) 
    { 
     return base.SetItems(editValue, value); 
    } 
} 

Что я должен сделать для достижения своей цели?

ответ

1

У вас есть несколько вариантов.

Вариант 1:

Если вы просто хотите, чтобы выставить FloorsGrouping.Items свойства во время разработки, вы можете изменить ее тип Tab свойства, чтобы SubItemsCollection и вернуть Items собственности. В этом случае вам не придется беспокоиться о перехвате каких-либо событий изменения коллекции, это произойдет автоматически.

[Category("Data")] 
[DisplayName("Tabs")] 
[Description("Tabsssssssssssss")] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
[Editor(typeof(ItemsCollectionEditor), typeof(UITypeEditor))] 
public SubItemsCollection Tab { 
    get { 
     return Items; 
    } 
} 

Вариант 2:

Если необходимость перехватывать событие изменения сбора, изменить Tabs класс наследовать от ObservableCollection<FloorsInformation>, который реализует INotifyCollectionChanged.

public class Tabs : System.Collections.ObjectModel.ObservableCollection<FloorsInformation> { 
} 

И в вашем FloorsGrouping конструктор, подписаться на CollectionChanged события.

public FloorsGrouping() { 
    ... 
    tabs.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(tabs_CollectionChanged); 
} 

Наконец, в обработчике событий обработайте смену коллекции.

private void tabs_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { 
    switch (e.Action) { 
     case System.Collections.Specialized.NotifyCollectionChangedAction.Add: 
      foreach (DockContainerItem dciItem in e.NewItems) { 
       if (!Parent.Controls.ContainsKey(dciItem.Name)) 
        Items.Add(dciItem); 
      } 
      break; 
     case System.Collections.Specialized.NotifyCollectionChangedAction.Reset: 
      Items.Clear(); 
      break; 
    } 
} 

Что вы заметите с вариантом 2 является то, что CollectionChanged срабатывает событие в реальном времени с редактированием в редакторе коллекции, не специально, когда кнопка OK нажата.Однако, когда пользователь, наконец, нажимает кнопку «ОК» или «Отмена» в редакторе коллекций, состояние коллекции является точным.