2010-09-28 3 views
2

Je remplace ma grille de propriétés par quelque chose qui me permettra de personnaliser un peu mieux mon interface utilisateur. J'ai placé un bouton sur mon formulaire qui, une fois cliqué, me ferait apparaître un CollectionEditor et me permettrait de modifier mon code. Lorsque j'utilisais PropertyGrid, tout ce que je devais faire était d'ajouter des attributs à la propriété pointant vers mon CollectionEditor et cela a fonctionné. Mais comment appeler manuellement le CollectionEditor? Merci!Est-il possible d'utiliser un objet CollectionEditor en dehors de la grille de propriétés?

Répondre

10

trouvé la réponse ici: http://www.devnewsgroups.net/windowsforms/t11948-collectioneditor.aspx

Juste au cas où le site lié ci-dessus en va un jour, voici l'essentiel. Le code est verbatim du lien ci-dessus, cependant; les commentaires sont à moi.

Supposons que vous avez un formulaire avec un ListBox et un bouton. Si vous vouliez modifier les éléments dans la liste en utilisant le CollectionEditor, vous effectuez les opérations suivantes dans votre gestionnaire d'événements:

private void button1_Click(object sender, System.EventArgs e) 
{ 
    //listBox1 is the object containing the collection. Remember, if the collection 
    //belongs to the class you're editing, you can use this 
    //Items is the name of the property that is the collection you wish to edit. 
    PropertyDescriptor pd = TypeDescriptor.GetProperties(listBox1)["Items"]; 
    UITypeEditor editor = (UITypeEditor)pd.GetEditor(typeof(UITypeEditor)); 
    RuntimeServiceProvider serviceProvider = new RuntimeServiceProvider(); 
    editor.EditValue(serviceProvider, serviceProvider, listBox1.Items); 
} 

Maintenant, la prochaine chose que vous devez faire est de créer le RuntimeServiceProvider(). Voici le code de l'affiche dans le lien ci-dessus a écrit à mettre en œuvre ceci:

public class RuntimeServiceProvider : IServiceProvider, ITypeDescriptorContext 
{ 
    #region IServiceProvider Members 

    object IServiceProvider.GetService(Type serviceType) 
    { 
     if (serviceType == typeof(IWindowsFormsEditorService)) 
     { 
      return new WindowsFormsEditorService(); 
     } 

     return null; 
    } 

    class WindowsFormsEditorService : IWindowsFormsEditorService 
    { 
     #region IWindowsFormsEditorService Members 

     public void DropDownControl(Control control) 
     { 
     } 

     public void CloseDropDown() 
     { 
     } 

     public System.Windows.Forms.DialogResult ShowDialog(Form dialog) 
     { 
      return dialog.ShowDialog(); 
     } 

     #endregion 
    } 

    #endregion 

    #region ITypeDescriptorContext Members 

    public void OnComponentChanged() 
    { 
    } 

    public IContainer Container 
    { 
     get { return null; } 
    } 

    public bool OnComponentChanging() 
    { 
     return true; // true to keep changes, otherwise false 
    } 

    public object Instance 
    { 
     get { return null; } 
    } 

    public PropertyDescriptor PropertyDescriptor 
    { 
     get { return null; } 
    } 

    #endregion 
} 
+1

+1 Fantast solution ic. Semble le seul inconvénient est que je ne peux pas voir si l'utilisateur appuie sur «Annuler». Est-ce que je manque quelque chose? – Brad

1

Puisque je ne peux pas commenter ce que je vais poster ici:

Vous pouvez obtenir le DialogResult en ajoutant un événement Cliquez sur le okButton du CollectionEditor dans WindowsFormsEditorService.ShowDialog

public System.Windows.Forms.DialogResult ShowDialog(Form dialog) 
{ 
    ((System.Windows.Forms.Button)dialog.Controls.Find("okButton", true)[0]).Click += WindowsFormsEditorService_Click; 
    return dialog.ShowDialog(); 
} 

...

private void WindowsFormsEditorService_Click(object sender, EventArgs e) 
{ 
    dr = DialogResult.OK; 
} 
Questions connexes