2010-07-22 5 views

Répondre

73

Vous pouvez transférer les événements comme celui-ci.:

public event EventHandler SelectedIndexChanged 
    { 
     add { inner.SelectedIndexChanged += value; } 
     remove { inner.SelectedIndexChanged -= value; } 
    } 
+0

belle, ne savait pas si la syntaxe est disponible pour des événements en C#. Vous pouvez donc y ajouter des effets secondaires pour l'assignation et la suppression des gestionnaires d'événements (par exemple si vous voulez les gérer vous-même ou faire quelque chose avec COM ou du code natif ou même avec du matériel) –

+4

faire attention à cela car l'expéditeur de l'événement n'est pas le contrôle externe mais l'interne. Cela pourrait être l'intension, mais il y a des cas où cela pourrait être indésirable. – GDS

+0

cela peut fonctionner correctement pour SelectedIndexChanged d'une liste déroulante, mais prend un peu plus de code pour travailler pour un autre événement comme CheckedChanged d'une case à cocher. En utilisant le code similaire à celui ci-dessus vous obtiendrez une syntaxe proche de la valeur alors que la réponse n ° 2 peut mieux fonctionner pour de tels cas. – gg89

3

Vous devrez les coder dans le contrôle vous-même - le contrôle utilisateur ne fait pas automatiquement la promotion des événements de ses contrôles enfants. Vous pouvez ensuite contre-fil de votre commande réelle à l'événement promu du contrôle de l'utilisateur:

 public event EventHandler SelectedIndexChanged; 

     private void OnSelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (SelectedIndexChanged != null) 
       SelectedIndexChanged(sender, e); 
     } 

     public UserControl1() 
     { 
      InitializeComponent(); 

      cb.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged); 
     } 

Malheureusement, vous devrez le faire pour chaque événement que vous êtes intéressé par

2

Une solution très simple plutôt que d'avoir des événements personnalisés serait d'exposer le contrôle imbriqué en tant que propriété du contrôle personnalisé. De là, vous pouvez attacher des gestionnaires d'événements très facilement. Il n'est pas toujours conseillé d'exposer les contrôles enfants, mais en fonction du type de contrôle et de la façon dont vous l'utilisez, cela peut fonctionner.

//create an instance of my control 
MyCustomControl controlInstance = new MyCustomControl(); 

//attach and event handler to the exposed subcontrol 
controlInstance.SaveButton.Click += new EventHandler(SaveButton_Click); 
+3

Ceci n'est pas incorrect, mais pour les lecteurs qui ne connaissent pas bien la création de contrôles utilisateur personnalisés, notez que La raison pour laquelle il n'est pas conseillé d'exposer les contrôles enfants est qu'il va à l'encontre de la finalité de l'encapsulation d'une fonctionnalité complète dans un contrôle utilisateur. En exposant un contrôle enfant entier, vous encouragez en fait le consommateur du contrôle utilisateur à manipuler directement le contrôle enfant. Au lieu de cela, essayez d'exposer le ou les deux événements absolument nécessaires par les consommateurs de votre contrôle utilisateur, plutôt que le contrôle enfant entier. – CobaltBlue

0

Il y a une autre façon de gérer que par le concepteur:

Sur le concepteur, dans votre contrôle personnalisé, sur la propriété combobox sous « Design » set « Modificateurs » à interne.

Alors, où vous devez faire quelque chose ajouter:

CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged; 

avec:

private void YourCombo_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Code to execute when the SelectedIndexIsChanged goes here 
} 
+0

fonctionne un peu plus commodément, mais toujours sous réserve de forme de commentaire CobaltBlue – gg89

Questions connexes