2009-07-28 10 views
1

J'ai un éditeur de collection personnalisé et je veux ajouter par programme des éléments à sa liste (collection) afin qu'ils puissent être visibles dans une liste. Comment je peux faire ça? Je connais la méthode AddItems de CollectionEditor, mais elle prend l'objet collection comme paramètre, mais je n'arrive pas à trouver l'objet liste interne de CollectionEditor ...:/Comment ajouter par programme des éléments à la liste/collection/collection de CollectionEditor? [modifié]

[update] Ugh .. le nom de la méthode appropriée est '' setItems [/ mise à jour]

[mise à jour 2] code source de ce que je suis en train de faire ...

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

[/ mise à jour 2]

+0

+1 pour poster une mise à jour pour expliquer sa solution !!! Maintenant, nous verrons si cela fonctionne pour moi ...;) – IAbstract

Répondre

0

I peut être malentendu yo Votre question, mais vous n'avez pas à définir votre propre collection en premier? puis décorer avec le EditorAttribute

[EditorAttribute (typeof (System.ComponentModel.Design.CollectionEditor), typeof (System.Drawing.Design.UITypeEditor))]

+0

Oui, vous avez raison. J'ai ma collection, j'ai dérivé la classe CollectionEditor et décoré ma collection comme vous l'avez suggéré. Ce que je veux faire est - dans CollectionEditor j'ai ajouté un bouton pour charger l'élément de DB (à côté des boutons d'origine pour ajouter et supprimer), après que je gère le chargement que je veux ajouter cet élément à la liste. Il existe une méthode pour 'définir' les éléments (dans CollectionEditor), mais il est nécessaire de transmettre la liste actuelle des objets, qui est protégée et donc inaccessible. – stavo

0

J'ai trouvé grâce à la solution .NET Réflecteur et mécanisme de réflexion. Au lieu d'utiliser la méthode de setItems J'invoque méthode privée de CollectionForm: private void AddItems(IList instances), comme ceci:

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

PS. Voir le reste du code ci-dessus ...

Questions connexes