2009-09-10 441 views
0

我有一個關於連線Web服務器控件的問題。從我見過的許多例子中,事件處理程序已經用私有訪問修飾符聲明。我試圖這樣做,如下所示:ASP.net Web服務器控件

<asp:Label runat="server" ID="lblMessage" Font-Names="Verdana" Text="Hello" /> 
     <br /> 
    <asp:Button runat="server" ID="btnSubmit" text="click me!" onClick="btnSubmit_Click" /> 

和代碼隱藏文件:

private void btnSubmit_Click(object sender, EventArgs e) 
    { 
     lblMessage.Text = "Goodbye"; 
    } 

但是,編譯器無法找到單擊處理程序,除非我改變訪問受保護的。

按鈕事件處理程序是否應該是私有的,如果是的話,爲什麼它在我的實例中不起作用?

此外,除了使用onClick屬性,還有其他方法將事件處理程序連接到在.aspx文件中聲明創建的控件?

由於提前, 勇

回答

4

什麼可能是這裏困惑的是,很多人直觀地設計自己的網頁表單。當他們想要將點擊處理程序連接到按鈕服務器控件時,他們通常會雙擊該按鈕或在Visual Studio中選擇它,按F4轉到其屬性並在該窗口中設置它的事件。這些方法都有以下效果:

  1. 在類後面的代碼中創建私有處理程序。它的名字是[control name] _ [event]。在你的情況下,這是btnSubmit_Click。

  2. 同樣在代碼隱藏文件中,每個Web服務器控件都有一個對應的受保護的代碼。在Init甚至,新創建的處理程序通過以下代碼與服務器控件上的Click事件關聯:

    btnSubmit.Click + = btnSubmit_Click;

通過這種方法,處理程序仍然可以是私有的。當你嘗試在ASPX文件本身中設置處理程序時,你遇到問題的地方在哪裏。在這種情況下,你將有更新的事件處理程序是非私有的,因爲你已經指出的,或定義ASPX頁面本身如下:

<script language="C#" runat="server"> 
    public void btnSubmit_Click(object sender, EventArgs e) 
    { 
    .. 
    } 
</script> 

私有方法/屬性的代碼隱藏類對ASPX頁面不可見。

+0

感謝David,我想這種強調visual studio的自動處理這麼多編碼過程的能力的一個缺點,它掩蓋了實際發生的事情和很多時間,並且你失去了更深入的理解。很好的解釋。 – yogibear 2009-09-10 05:12:05

+0

專用處理程序行爲僅適用於Visual Studio 2003,2005+將其寫入ASPX文件並創建受保護的方法AFAIK。 – 2009-09-10 05:28:18

+0

@Wyatt:很高興知道。 – 2009-09-10 05:38:22

1

事件處理程序需要爲protected。原因是ASP.NET實際上會生成一個新的類,它繼承自您在代碼隱藏中定義的類,而不是使用類本身。

作爲替代方案,你可以寫:

btnSubmit.Click += new EventHandler(btnSubmit_Click); 

在Page_Load處理程序,但我不會推薦它。在VB.NET中,我相信你也可以使用關鍵字Handles,但它在C#中不可用。