2012-11-21 21 views
6

カスタムコントロールを作成しました。それは "タブ"と呼ばれるプロパティを持っています。このプロパティは、 "DockContainerItem"クラスから継承した "FloorsInformation"コントロールのコレクションをカスタムコントロールに追加します。デザイン時に "CollectionEditor"ウィンドウの "OK"ボタンをクリックした後にサブコントロールをカスタムコントロールに追加します。

My custom control properties

は今、私は後にタブ「CollectionEditor」ウィンドウの「OK」ボタンをクリックして、私のカスタムコントロールに「FloorsInformation」のコントロールを追加します。

"Tabs Collection Editor" window

私はそれを行うための "AddTabs" メソッドを持っています。しかし、私は正しい場所でそれを呼び出すことはできません。私は "タブ"プロパティの "アクセサを設定"で "AddTabs"メソッドを呼び出す必要がありますが、決して発生しません。

また、 "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; 
    } 
} 

、私は「CollectionEditor」クラスから継承される「ItemsCollectionEditor」クラスの「SetItems」オーバーライドメソッドでこのメソッドを呼び出すことができます。それにもかかわらず、カスタムコントロールクラスの新しいインスタンスを作成せずに「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プロパティを公開するために欠けている場合は、あなたがSubItemsCollectionTabプロパティのタイプを変更し、Itemsプロパティを返すことができます。この場合、コレクションの変更イベントを傍受する心配はありません。自動的に発生します。

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

オプション2:

あなたは、コレクションの変更イベントをインターセプトする必要がされている場合は、INotifyCollectionChangedを実装ObservableCollection<FloorsInformation>、継承するTabsクラスを変更します。

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

そして、あなたのFloorsGroupingコンストラクタで、CollectionChangedイベントをサブスクライブ。

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

最後に、イベントハンドラで、コレクションの変更を処理します。あなたはオプション2と気づく何

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

は、コレクションエディタで編集すると、リアルタイムでCollectionChangedイベントが発生し、特にOKボタンがクリックされないということです。ただし、ユーザーが最終的にコレクションエディタで[OK]または[キャンセル]ボタンをクリックすると、コレクションの状態は正確になります。

関連する問題