2012-11-21 24 views
6

Özel denetimimi oluşturdum. "Tab" olarak adlandırılan bir özelliğe sahiptir. Bu özellik, "DockContainerItem" sınıfından özel denetimime devralınan "FloorsInformation" denetimleri topluluğunu ekler.Tasarım kontrolünde "CollectionEditor" penceresinin "OK" tuşuna tıkladıktan sonra özel kontrole alt kontroller ekleyin

My custom control properties

Şimdi, sonra Sekme "CollectionEditor" penceresinin "Tamam" butonuna tıklayın benim özel denetime "FloorsInformation" denetimleri eklemek istiyorum.

"Tabs Collection Editor" window

Bunu yapmak için "AddTabs" yöntemi vardır. Ancak, doğru yerde arayamıyorum. "Tab" özelliğinin "set accessor" bölümünde "AddTabs" yöntemini çağırmalıyım, ancak asla oluşmaz.

"Tab" özelliğinin "get accessor" kısmından da bu yöntemi çağırabilirim, ancak "Tab" özelliğinin "accessor" bölümünde bu yöntemi çağırmak, programa erişim olduğu için bir hatayla sonuçlanacaktır. sürekli "Sekme" özelliğinden "erişim" alın.

arada
[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; 
    } 
} 

, ben "CollectionEditor" sınıfından devralınan "ItemsCollectionEditor" sınıfının "SetItems" overrode yönteminde bu yöntemi çağırabilirsiniz; Yine de, özel kontrol sınıfımın yeni bir örneğini oluşturmadan "AddTabs" yöntemine erişemiyorum. Özel denetimimin yeni bir örneğini oluşturursam, "AddTabs" yöntemi, özel denetimimin yeni denetimindeki değişiklikleri uygular ve WinForm'daki mevcut ek özel denetimde değil.

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); 
    } 
} 

Hedefime ulaşmak için ne yapmalıyım?

cevap

1

Birkaç seçeneğiniz var.

Seçenek 1: Sadece tasarım zamanında FloorsGrouping.Items özelliği göstermiyor isteyen varsa

, sen SubItemsCollection için Tab tesisin türünü değiştirmek ve Items özelliğini döndürebilir. Bu durumda, herhangi bir koleksiyon değişikliği olayını engellemek için endişelenmenize gerek kalmaz, otomatik olarak sizin için gerçekleşir.

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

Seçenek 2:

Eğer toplama değişim olaylarını durdurmak için gerek varsa, INotifyCollectionChanged uygulayan ObservableCollection<FloorsInformation>, devralmak Tabs sınıfını değiştirin.

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

Ve FloorsGrouping yapıcısındaki

, CollectionChanged olaya abone olun.

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

Son olarak, olay işleyicinizde, toplama değişikliğini işleme koyun.

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; 
    } 
} 

Ne 2 seçeneği ile fark edeceksiniz toplama editörü düzenleme ile gerçek zamanlı olarak CollectionChanged olay yangınlar değil özellikle Tamam düğmesi tıklandığında olmasıdır.Bununla birlikte, kullanıcı en sonunda koleksiyon editöründeki Tamam veya İptal düğmesini tıkladığında, koleksiyonun durumu doğrudur.