2009-07-28 51 views
1

我有自定義集合編輯器,我想以編程方式將項目添加到它的列表(集合),以便它們可以在列表框中可見。我該怎麼做?我知道CollectionEditor的爲addItems的方法,但它需要收集對象作爲參數,但我不能想出一個辦法讓CollectionEditor的內部列表對象...:/如何以編程方式將項目添加到CollectionEditor的列表/列表框/集合? [修改]

[更新] 唉..正確的方法名稱爲'SetItems' [/更新]

[更新2]的什麼,我試圖做 源代碼

public class MyCollectionEditor : CollectionEditor 
{ 
     private Type m_itemType = null; 

     public MyCollectionEditor(Type type) 
      : base(type) 
     { 
      m_itemType = type; 
     } 

     protected override CollectionForm CreateCollectionForm() 
     { 
      Button buttonLoadItem = new Button(); 
      buttonLoadItem.Text = "Load from DB"; 
      buttonLoadItem.Click += new EventHandler(ButtonLoadItem_Click); 

      m_collectionForm = base.CreateCollectionForm(); 

      TableLayoutPanel panel1 = m_collectionForm.Controls[0] as TableLayoutPanel; 
      TableLayoutPanel panel2 = panel1.Controls[1] as TableLayoutPanel; 
      panel2.Controls.Add(buttonLoadItem); 

      return m_collectionForm; 
     } 

     private void ButtonLoadItem_Click(object sender, EventArgs e) 
     { 
      if (m_itemType.Equals(typeof(MyCustomCollection))) 
      {    
       MyCustomItem item = ...load from DB... 

       //definition: SetItems(object editValue, object[] value); 
       SetItems(-> what goes here?! <- , new object[] { item }); 
      } 
     } 
} 

[/更新2]

+0

+1發佈更新,以充分解釋他的解決方案!現在我們將看看它是否適用於我...;) – IAbstract 2010-02-07 22:57:43

回答

0

我可能是誤解喲你的問題,但你不必先定義你自己的收藏?然後與EditorAttribute

[EditorAttribute(typeof運算(System.ComponentModel.Design.CollectionEditor)的typeof(System.Drawing.Design.UITypeEditor))]

+0

是的,你是對的。我有我的收藏,我得到CollectionEditor類,並按照你的建議裝飾我的收藏。我想要的是 - 在CollectionEditor中,我添加了一個按鈕來從數據庫加載項目(在原始按鈕旁邊添加和刪除),在處理加載後,我想將此項目添加到列表中。 有一種「設置」項目的方法(在CollectionEditor中),但是必須傳遞實際的對象列表,這些對象被保護並因此無法訪問。 – stavo 2009-07-28 10:19:52

0

我發現溶液由於.NET裝飾它反射器和反射機制。而不是使用SetItems方法我調用私有方法CollectionForm的:private void AddItems(IList instances),像這樣:

MethodInfo methodInfo = m_collectionForm.GetType().GetMethod("AddItems", BindingFlags.NonPublic | BindingFlags.Instance); 
methodInfo.Invoke(m_collectionForm, new object[] { /* my items here */ }); 

PS。看到上面的代碼的其餘部分...

相關問題