2010-06-17 8 views

Répondre

3

Cela peut être un désavantage d'un UserControl. Vous devez republier les événements et les propriétés d'un ou de plusieurs de ses contrôles incorporés. Considérez l'alternative: si ce UserControl contient seulement un ListBox alors vous feriez mieux de simplement hériter de ListBox au lieu de UserControl.

Anyhoo, vous devrez relancer l'événement SelectedIndexChanged. Et vous devrez sûrement être en mesure de laisser le code client lire l'élément actuellement sélectionné. Ainsi:

public partial class UserControl1 : UserControl { 
    public event EventHandler SelectedIndexChanged; 

    public UserControl1() { 
     InitializeComponent(); 
    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { 
     EventHandler handler = SelectedIndexChanged; 
     if (handler != null) handler(this, e); 
    } 
    public object SelectedItem { 
     get { return listBox1.SelectedItem; } 
    } 
} 
+0

I trouvez mieux cette approche car il semble que l'événement soit déclenché par 'this' au lieu d'un contrôle" inconnu "quelque part dans un autre contrôle, ce qui arrive si vous faites juste' listBox1.SelectedIndexChanged + = value' dans votre contrôle utilisateur. – Patrick

+0

Merci. Cela a fonctionné parfaitement. – Wildhorn

4

Si vous utilisez WinForms, vous devez câbler cet événement manuellement. Créez un événement avec la même signature sur votre contrôle personnalisé, créez un gestionnaire pour le pair sur la liste d'origine à l'intérieur de votre contrôle personnalisé et dans ce gestionnaire, déclenchez l'événement nouvellement créé. (Ignorer tout cela si vous utilisez WPF)

+0

Oui j'utilise WinForm, un exemple serait utile – Wildhorn

3

Vous pouvez ajouter un événement proxy pour le contrôle personnalisé

public event EventHandler<WhatEverEventArgs> IndexChanged { 
    add { listBox.IndexChanged += value; } 
    remove { listBox.IndexChanged -= value; } 
} 
+0

+1 Les propriétés d'événement semblent être une fonctionnalité peu connue. En plus de cette situation, ils sont utiles pour stocker les délégués du gestionnaire d'événements dans une EventHandlerList (ce qui est généralement le cas des contrôles intégrés) au lieu d'avoir un délégué de gestionnaire d'événements réel comme champ de votre classe pour chaque événement exposé par votre classe. . Cela permet de réduire l'empreinte de votre classe si elle contient un grand nombre d'événements qui n'auront pas toujours un abonné. (http://msdn.microsoft.com/en-us/library/8843a9ch.aspx) (http://msdn.microsoft.com/en-us/library/system.componentmodel.component.events.aspx) –

0

Regardez dans Ninjects Extension du MessageBroker, et sur l'indice changé soulever un événement publié, et abonnez-vous à l'événement du côté du formulaire.

Le messagebroker est plutôt utile dans la plupart des cas.

Une autre idée serait de mettre en œuvre un modèle d'observateur et d'ajouter le formulaire en tant qu'observateur à l'événement controls.

Questions connexes