2012-11-21 8 views
6

मैंने अपना कस्टम नियंत्रण बनाया है। इसमें एक संपत्ति है जिसे "टैब" कहा जाता है। यह संपत्ति "फ़्लोर इनफॉर्मेशन" नियंत्रणों का एक संग्रह जोड़ती है जो "डॉककॉन्टेनरइटेम" कक्षा से मेरे कस्टम नियंत्रण में विरासत में प्राप्त होती हैं।डिज़ाइन समय में "संग्रह एडिटर" विंडो के "ठीक" बटन पर क्लिक करने के बाद कस्टम नियंत्रण में उप नियंत्रण जोड़ें

My custom control properties

अब, मैं "ठीक है" टैब "CollectionEditor" खिड़की के बटन पर क्लिक करेंगे अपने कस्टम नियंत्रण करने के लिए "FloorsInformation" नियंत्रण जोड़ना चाहते हैं।

"Tabs Collection Editor" window

मुझे लगता है कि ऐसा करने के लिए "AddTabs" विधि है। हालांकि, मैं इसे सही जगह पर नहीं बुला सकता हूं। मुझे "टैब" संपत्ति के "सेट एक्सेसर" में "AddTabs" विधि को कॉल करना होगा, लेकिन ऐसा कभी नहीं होता है।

मैं इस विधि को "टैब" संपत्ति के "एक्सेसर" प्राप्त करने से भी कॉल कर सकता हूं, लेकिन "टैब" संपत्ति के "एक्सेसर" प्राप्त करने में इस विधि को कॉल करने से एक त्रुटि हो जाएगी, क्योंकि प्रोग्राम " निरंतर "टैब" संपत्ति का एक्सेसर प्राप्त करें।

[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" वर्ग से विरासत में मिली है overrode विधि में इस विधि कॉल कर सकते हैं; फिर भी, मैं अपने कस्टम नियंत्रण वर्ग का एक नया उदाहरण बनाये बिना "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 संपत्ति का पर्दाफाश करने के लिए इच्छुक रहे हैं, तो आप SubItemsCollection को Tab संपत्ति का प्रकार बदलने और Items संपत्ति लौट सकते हैं। इस मामले में, आपको किसी भी संग्रह परिवर्तन घटनाओं को रोकने में चिंता करने की आवश्यकता नहीं होगी, यह आपके लिए स्वचालित रूप से होगा।

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

विकल्प 2:

आप संग्रह परिवर्तन की घटनाओं अवरोधन करने की आवश्यकता होगी, रहे हैं, तो ObservableCollection<FloorsInformation>, जो INotifyCollectionChanged लागू करता है से प्राप्त करना Tabs वर्ग को संशोधित।

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 घटना आग, विशेष रूप से नहीं जब ठीक बटन क्लिक किया जाता है है।हालांकि, जब उपयोगकर्ता अंततः संग्रह संपादक में ठीक या रद्द बटन क्लिक करता है, तो संग्रह का राज्य सटीक होता है।

संबंधित मुद्दे

 संबंधित मुद्दे