2009-11-19 7 views
2

Je suis une personne qui apprend C#, et j'ai un programme avec un formulaire Parent et un formulaire Enfant. Je veux que le formulaire enfant déclenche un événement pour que le formulaire Parent puisse faire quelque chose. J'ai copié du code, mais je ne suis pas assez intelligent pour voir ce qui ne va pas. Je ne sais pas comment coder correctement l'événement dans le formulaire enfant. L'erreur est DatasourceUpdated n'est pas définie. Quelqu'un peut-il m'aider avec une solution suggérée?C# Custom Event Handler

Sous la forme d'enfant je

public partial class Form2 : Form 
{ 
    public EventHandler DataSourceUpdated; 
    ... 
    private void button2_Click(object sender, EventArgs e) //Done button 
    { 
     if (this.DataSourceUpdated != null) //raise the event 
     { 
      this.DatasourceUpdated(); 
     } 

     this.Close(); 
    } 

Dans la forme de parent, j'ai ceci:

private void myAddRecord() 
{ 
    string myID = string.Empty; 
    string myMessage = "Insert"; 

    Form2 myForm = new Form2(myID, myMessage); 

    Form2.DatasourceUpdated += ChildUpdated; 
    myForm.Show(); 
+1

Où ChildUpdated est-il défini? Pouvez-vous nous montrer le code? –

+0

J'ai une méthode appelée InsertRecord qui gère la mise à jour SQL sur le formulaire enfant.Ai-je besoin de définir DataSourceUpdated à partir des résultats de InsertRecord ou est-ce que je n'ai que la référence eventhandler InsertRecord? –

+0

@ Mark W, vous ne devriez pas modifier les erreurs de votre question. Maintenant, si quelqu'un lisait votre question, il ne verrait pas le problème que vous aviez et ne réalisera peut-être pas que vous avez mis à jour votre question avec un code «fixe», ce qui l'amènerait à penser que ce que vous avez posté est incorrect. –

Répondre

1

Votre code semble correct, autant que je sache, tant que vous avez un gestionnaire réel; vous ne l'avez pas inclus dans votre code. ChildUpdated doit être une méthode avec la signature void (object sender, EventArgs e), et vous devez également déclencher l'événement comme celui this.DataSourceUpdated(this, null);

La signature est spécifiée par le fait que vous déclarer l'événement comme étant géré par System.EventHandler, qui a ce Signature. Vous pouvez également créer vos propres délégués, si vous voulez qu'ils reçoivent des paramètres spéciaux ou pas de paramètres du tout.

En outre, vous avez un boîtier inexact dans votre exemple, this.DatasourceUpdated ->this.DataSourceUpdated, mais je suppose que c'est juste dans votre exemple ...?

0

événements .NET ont à la fois un objet "expéditeur" et un objet "EventArgs". Ceux-ci doivent être inclus lorsque votre événement est appelé.

par exemple:

private void button2_Click(object sender, EventArgs e) //Done button 
{ 
    if (this.DataSourceUpdated != null) //raise the event 
    { 
     this.DatasourceUpdated(this, EventArgs.Empty); 
    } 

    this.Close(); 
} 
+0

Il l'a également déclaré en tant que délégué, pas un événement. –

2
Form2.DatasourceUpdated += ... 

vous essayez de joindre votre gestionnaire à la classe essayer à la place

myForm.DatasourceUpdated += ... 
+0

Il existe également des problèmes dans la classe Form2, avec la manière dont l'événement est déclaré et déclenché. –

0

tout d'abord il y a une petite faute de frappe: DatasourceUpdated vs DataSourceUpdated. Voir la capitale S? En outre, ne pas oublier les args et de déclarer la DataSourceUpdated comme event:

public event EventHandler DataSourceUpdated; 

... 

this.DataSourceUpdated(this, EventArgs.Empty); 

Un autre problème que je remarque est que votre appeler un membre statique lorsque vous devez appeler une membre de l'instance:

Form2.DatasourceUpdated += ChildUpdated; 

à

myForm.DatasourceUpdated += ChildUpdated; 
4

En ce moment, vous déclarer un gestionnaire d'événements, pas un événement. Changer cela:

public partial class Form2 : Form 
{ 
    public event EventHandler DataSourceUpdated; 
     ... 
    private void button2_Click(object sender, EventArgs e) //Done button 
    { 
     if (this.DataSourceUpdated != null) //raise the event  
     {   
      this.DataSourceUpdated(this, EventArgs.Empty);  
     }  
     this.Close(); 
    } 

Aussi, quand vous allez souscrire à votre événement, vous devez vous abonner à l'événement sur l'instance, et non sur la classe:

Form2 myForm = new Form2(myID, myMessage); 
myForm.DataSourceUpdated+= ChildUpdated; 
myForm.Show(); 

En effet, l'événement est déclaré au niveau de l'instance, pas de manière statique.