2011-05-01 93 views
1

我要發佈一些更多的代碼來顯示我正在嘗試做什麼, 我使用編程代碼添加按鈕而不是標記,但OnClick不起作用(給出以下內容錯誤:Button.OnClientClick question

System.Web.UI.WebControls.Button.OnClick(System.EventArgs)' is inaccessible due to its protection level.

Button btnopslaan = new Button(); 
btnopslaan.Text = "Opslaan"; 
btnopslaan.ID = "btnOpslaan"; 
btnopslaan.CssClass = ".opslaan"; 
btnopslaan.Click += new EventHandler(btnopslaanClick); 
btnopslaan_arr[btn_count] = btnopslaan; 
add_button(btnopslaan); 

protected void btnopslaanClick(object sender, EventArgs e) 
{ 
    Debug.WriteLine("success"); 
} 

我無法找出爲什麼這不工作

任何人誰可以幫我出

回答

2

您將其設爲回發調用服務器。在

ASPX寫:

<asp:Button runat="server" ID="buttonOpslaan" Text="opslaan" ></asp:Button> 

代碼隱藏寫:

<asp:Button runat="server" 
    ID="buttonOpslaan" 
    OnClick="buttonOpslaan_Click" 
    Text="opslaan" ></asp:Button> 

// mind: this method cannot be private, but has to be protected at least. 
protected void buttonOpslaan_Click(object sender, EventArgs e) 
{ 
    //do something 
} 

或:

protected void Page_Init(object sender, EventArgs e) 
{ 
    buttonOpslaan.Click += new EventHandler(buttonOpslaan_Click); 
} 

// mind: this method can be private 
void buttonOpslaan_Click(object sender, EventArgs e) 
{ 
    //do something 
} 

AutoEventWireUp(推薦),如處理它做它com pletely從後面的代碼:

// note: buttonOpslaan must have an (autoassigned) ID. 
protected void Page_Init(object sender, EventArgs e) 
{ 
    Button buttonOpslaan = new Button(); 
    buttonOpslaan.Text = "opslaan!"; 
    buttonOpslaan.Click += new EventHandler(buttonOpslaan_Click); 
    form1.Controls.Add(buttonOpslaan); 
} 

protected void buttonOpslaan_Click(object sender, EventArgs e) 
{ 
    //do something 
} 

或處理它在你的ASPX與JavaScript客戶方(也不會到達服務器)

<script type="text/javascript"> 
    function buttonOpslaan_Click(){ 
     alert("test"); 
     return false; 
    } 
</script> 
<asp:Button runat="server" 
    ID="buttonOpslaan" 
    OnClientClick="buttonOpslaan_Click()"   
    Text="opslaan" ></asp:Button> 

更新:通過評論

如果通過事件處理程序添加控件(如dropdownlistonchange event),則控件在下一次回發時會「丟失」,或者即使頁面發送到第(由於無狀態(沒有機制來維持應用程序狀態)行爲和.Net的lifecycle)。

因此,簡單地添加一個控件永遠不會工作。

這意味着你必須重建每次回發發生時間控制。我最喜歡的方式是在某處存儲一個列表/文檔,以說明每次必須創建哪些控件。其位置可能是,從糟糕到好(恕我直言):

  • 會議
  • 視圖狀態
  • 緩存
  • XML/IO
  • 數據庫

畢竟,你要留言「數據「發送到服務器(表示控件),並且要將其保存以供進一步使用。

如果要創建的控制不那麼複雜,你可以實現一個工廠模式像一個WebControlFactory只存儲在一個列表或字典,這是閱讀每再重新創建控件時一些屬性(和再次,一次又一次)

+0

不能使用aspx couse我使用編程代碼來添加按鈕。我嘗試了EventHandles,但仍然無法運行:/。 – Nico 2011-05-01 13:11:46

+0

已更新的帖子;) – 2011-05-01 13:18:38

+0

試着重新編寫按鈕的代碼片段,就像你說'完全從代碼背後完成'一樣,但是仍然,我點擊按鈕刷新頁面,清除整個頁面但沒有按照我的要求(嘗試一個測試標籤並點擊testlabel.text =「succes」,但olso卻什麼也不做) – Nico 2011-05-01 13:28:50

4

您需要使用OnClick保護Ser?版本一側的點擊,而不是的OnClientClick

要麼你可以用它內嵌>

<asp:Button id="btnopslaan" runat="server' OnClick="btnopslaanClick" /> 

還是在後面的代碼>

btnopslaan.Click+=new EventHandler(btnopslaanClick); 
+0

這就是我想要的,但是當我使用它時,它給出了以下錯誤:'System.Web.UI.WebControls.Button.OnClick(System.EventArgs)'是無法訪問deu到其保護水平。' – Nico 2011-05-01 12:59:16

+0

更新了我的答案 – neebz 2011-05-01 13:05:22

0

btnopslaanClick應該是客戶端,在.aspx本身有:

<script type="text/javascript"> 
function btnopslaanClick() { 
    alert("success"); 
} 
</script> 
+0

不能使用aspx becouse我使用編程代碼添加按鈕而不是aspx – Nico 2011-05-01 13:03:22

+1

@Nico根本不相關。如何創建按鈕並不重要,如果你想使用'OnClientClick',你需要在頁面中有JS代碼。 – 2011-05-01 13:05:45

0
btnopslaan.Click+=new EventHandler(btnopslaanClick); 

protected void btnopslaanClick(object sender, EventArgs e) 
{ 

    Debug.WriteLine("succes"); 

} 
+0

這就是我所做的,但是當我使用它時,它給出了以下錯誤:'System.Web.UI.WebControls.Button.OnClick(System.EventArgs)'是無法訪問的deu到其保護級別。 – Nico 2011-05-01 13:04:14

+0

我現在編輯請檢查 – 2011-05-01 13:04:38