Comment puis-je passer des variables à une méthode d'événement de boutons?
J'ai besoin d'être en mesure de passer le long de deux objets à la méthode de feu lorsque je clique sur un bouton. Comment puis-je faire cela?
Jusqu'à présent, j'ai été à la recherche à la création d'un changé eventArgs:
public class CompArgs : System.EventArgs
{
private object metode;
private Type typen;
public CompArgs(object m, Type t)
{
this.metode = m;
this.typen = t;
}
public object Metode()
{
return metode;
}
public Type Typen()
{
return typen;
}
}
Mais comment pourrais-je l'utiliser? Est-il possible de faire en quelque sorte remplacer le clic-événement du bouton d'utiliser un gestionnaire d'événements, qui prend CompArgs comme paramètre?
private void button1_Click(object sender, EventArgs e)
{
Assembly assembly = Assembly.LoadFile(@"c:\components.dll");
int counter = 0;
foreach (Type type in assembly.GetTypes())
{
if (type.IsClass == true)
{
Button btn = new Button();
btn.Location = new Point(174 + (counter * 100),10);
btn.Size = new Size(95, 23);
btn.Name = type.Name;
btn.Text = type.Name;
btn.UseVisualStyleBackColor = true;
this.Controls.Add(btn);
object obj = Activator.CreateInstance(type);
//I need to pass on obj and type to the btn_Click
btn.Click += new eventHandler(btn_Click);
counter++;
}
}
}
Et l'événement-méthode où j'en ai besoin:
private void btn_Click(object sender, CompArgs ca)
{
MessageBox.Show((string)ca.Typen().InvokeMember("getMyName",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
ca.Metode(),
null));
}
source d'informationauteur Bildsoe
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas vous venez de définir une propriété ou d'une variable de membre sur le formulaire qui héberge le bouton et l'accès à partir de l'événement click du bouton?
EDIT: bouton personnalisé de la classe suggestion après les commentaires (pas la même suggestion que ci-dessus)
Wow, vous les gars se font entièrement à difficile. Pas besoin de classes personnalisées ou remplacements de méthode. Dans cet exemple, j'ai juste besoin de passer d'un onglet numéro d'index. Vous pouvez spécifier ce que vous voulez, tant que votre méthode s'attend à ce que le type de valeur.
J'avais créer un nouveau Bouton et remplacer la méthode OnClick. Plutôt que de passer en bas de la EventArgs, passer une nouvelle classe dérivée avec vos membres supplémentaires.
Sur le délégué de la réception de l'événement, la fonte de la EventArgs le plus classe dérivée, vous vous attendez à obtenir, sinon l'installation d'un nouvel Événement, qui seront lancés dans le même temps, lorsque le bouton est enfoncé et le crochet jusqu'à ce que, au lieu de rendre les choses plus implicite.
Exemple De Code:
Ne sais pas si cela existe en Winforms, mais il n'en WPF: Il y a un "tag" objet de toutes les commandes que vous pouvez joindre n'importe quel objet. Vous pourriez économiser de l'objet que vous souhaitez transmettre et ensuite dans le gestionnaire d'événements de le lire, de retour de l'objet expéditeur.
Vous ne pouvez pas utiliser votre propre argument d'événement de la classe pour un événement prédéfini signature du gestionnaire. Au moins, la coutume de l'événement type d'argument ne sera jamais utilisé par défaut appels pour le gestionnaire (qui ne pourront jamais être de type
EventArgs
dans le cas d'un bouton); on pourrait, éventuellement, faire appel au gestionnaire de vous-même, en passant votre type personnalisé, cependant, vous avez besoin d'avoir de logique dans l'ordre de le jeter en arrière à partir d'uneEventArgs
dans lequel il avait été jeté.Comme une solution possible (selon votre situation), pensez à un type composite à encapsuler les éléments dont vous avez besoin, comme avec votre événement type d'argument, mais garder le nécessaire instance accessible variable qui peut être utilisée à partir de dans le gestionnaire d'événements, ou, au moins, par la méthode/s le même gestionnaire invoque.
Par exemple, de définir votre type de...
Et, dans votre classe de formulaire...
EDIT:
Bon, en regardant votre code actuel, je ne peux vous offrir cela pour l'instant (il n'ajoute pas les éléments pour le contrôle de formulaires contenant et qu'il utilise une variable itérateur dans Linq (qui je pense est soit mal vu ou juste en bas à droite de mal (?), mais bon...):
Vous pouvez utiliser le Tag propriété du bouton. Vous pouvez ajouter une chaîne de valeur à cette propriété par le concepteur de la fenêtre propriétés, puis le ramasser dans le gestionnaire de la manière suivante:
Aimerais voir plus de code pour donner une meilleure réponse, mais vous pouvez créer un événement qui prend votre CompArgs en tant que paramètre et est déclenché lorsque la buttonEvent est capturé
Si vous ouvrez yourForm.Le concepteur.cs fichier, vous trouverez tous les code généré automatiquement par le VS. Ici, vous pouvez modifier la méthode appelée lors d'un clic sur le bouton (ou en ajouter une seconde méthode).
Espère que cette aide.