2009-11-19 208 views
2

我是一個學習c#的人,我有一個帶有父窗體和子窗體的程序。我希望子表單能夠引發事件,以便父表單可以執行某些操作。我複製了一些代碼,但我不夠聰明,看不到有什麼問題。我不知道如何在子窗體中正確編寫事件。該錯誤是DatasourceUpdated未定義。任何人都可以幫我解決一個建議的問題嗎?C#自定義事件處理程序

子窗體我有

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(); 
    } 

在我這個父窗體:

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

    Form2 myForm = new Form2(myID, myMessage); 

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

ChildUpdated定義在哪裏?你能告訴我們代碼嗎? – 2009-11-19 17:49:36

+0

我有一個名爲InsertRecord的方法來處理子窗體上的SQL更新。我是否需要從InsertRecord的結果中設置DataSourceUpdated,還是隻需要事件處理程序引用InsertRecord? – 2009-11-19 18:16:54

+0

@Mark W,你不應該編輯你的問題的錯誤。現在,如果有人讀你的問題,他們不會看到你的實際問題,並可能沒有意識到你用「固定」代碼更新了你的問題,使他們也許認爲你發佈的內容實際上是不正確的。 – 2009-11-19 18:51:44

回答

1

只要你有一個實際的處理程序,你的代碼看起來是正確的,據我所知,你沒有將它包含在你的代碼中。 ChildUpdated需要是與簽名void (object sender, EventArgs e),你應該也提出這樣的this.DataSourceUpdated(this, null);

正在由你聲明事件由System.EventHandler被處理,其中有一個事實,指定的簽名事件的方法簽名。如果您想要它接收一些特殊參數或根本沒有參數,您也可以創建自己的代表。

此外,您的示例中有一個不正確的框,this.DatasourceUpdated - >this.DataSourceUpdated,但我會假設這只是在您的示例中...?

0

.NET事件既有「發件人」對象和「EventArgs的」對象。這些需要被包括在你的事件被調用時。

例如:

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

他也被宣佈爲代表,而不是事件。 – 2009-11-19 17:52:04

2
Form2.DatasourceUpdated += ... 

你試圖附加處理程序的類試試這個,而不是

myForm.DatasourceUpdated += ... 
+0

Form2類也存在問題,該事件如何聲明和引發。 – 2009-11-19 17:54:13

0

首先,有一個小錯字:DatasourceUpdated VS DataSourceUpdated。看大寫字母S?另外,不要忘了指定參數和申報DataSourceUpdatedevent

public event EventHandler DataSourceUpdated; 

... 

this.DataSourceUpdated(this, EventArgs.Empty); 

還有一個問題,我注意到的是,你打電話時,你應該調用一個實例成員靜態成員:

Form2.DatasourceUpdated += ChildUpdated; 

myForm.DatasourceUpdated += ChildUpdated; 
4

現在,你聲明一個EventHandler,而不是一個事件。更改爲:

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(); 
    } 

而且,當你去訂閱你的事件,您需要訂閱實例上的事件,而不是通過類:

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

這是因爲該事件是在實例級聲明的,而不是靜態的。