2012-08-10 410 views
4

目前,我正在爲學生宿舍做一個項目,現在我必須實施一些關於學生的搜索策略。在用戶點擊時必須動態創建一個按鈕.aspx頁面中的另一個服務器按鈕,因此我必須爲新創建的按鈕創建onclick事件處理程序。我使用的代碼片段是:如何爲動態創建的按鈕創建onClick eventHandler

protected void btnsearchByName_Click(object sender, EventArgs e) 
    { 
     TextBox tbsearchByName = new TextBox(); 
     Button btnsearchName = new Button(); 
     tbsearchByName.Width = 250; 
     tbsearchByName.ID = "tbsearchByName"; 
     tbsearchByName.Text = "Enter the full name of a student"; 
     btnsearchName.ID = "btnsearchName"; 
     btnsearchName.Text = "Search"; 
     btnsearchName.Click += new EventHandler(this.btnsearchName_Click); 

     pnlsearchStudents.Controls.Add(tbsearchByName); 
     pnlsearchStudents.Controls.Add(btnsearchName); 
    } 
    protected void btnsearchName_Click(object sender, EventArgs e) 
    { 
     lblsearch.Text = "btnsearchName_Click event fired in " + DateTime.Now.ToString(); 

    } 

這裏,問題是新創建的eventHandler沒有被觸發。我瀏覽過這個網站,看了幾個問題和答案,也瀏覽了頁面生命週期,他們都說動態按鈕應該在Init或Pre_init上,但是我的問題是我必須在另外一個按鈕被點擊時創建它,怎麼可能呢?

+0

是否應該點擊事件導致頁面回發? – 2012-08-10 11:00:05

+0

不,它不會得到回覆@Saint – Jivan 2012-08-10 11:01:38

+0

@burning_LEGION,你在我的問題上編輯了什麼?我找不到任何改進? – Jivan 2012-08-10 11:07:53

回答

3

您需要在每次回發中添加按鈕的點擊處理程序。

您可以在頁面加載時在搜索學生面板中查找按鈕,或嘗試使用頁面OnInit()方法在創建處理程序時添加處理程序。

也檢查這裏:

Dynamically added ASP.NET button click handler being ignored

這裏: asp.net dynamically button with event handler

這裏: asp:Button Click event not being fired

(所有給出類似的建議)

+0

你的意思是我必須在OnInit方法上創建onclick處理程序嗎? @WraithNath – Jivan 2012-08-10 11:10:46

+0

嗨,是的,你可以嘗試你正在使用的頁面的OnInit方法,你可以嘗試在oninit方法中找到控件,並從那裏添加處理程序。你可以嘗試的另一件事是在設計器中使用按鈕,但使用style =「display:none」或visible = false這樣就不會渲染,但你仍然可以添加處理程序而不必找到控件(依賴於無論是在網格中,還是在網頁上等) – WraithNath 2012-08-10 12:05:47

-1

你只需要將此代碼添加到就緒狀態jQuery的代碼,它會正常工作的動態按鈕太

$(document).ready(function(){ 
    $('input#tbsearchByName').click(function(){ 
     // code goes here 
    }); 
}); 
0

您需要重新創建按鈕,每次附加事件處理程序。爲此,創建一個按鈕列表並將其保存在會話中。在頁面加載,瀏覽清單,每次

public Button create_button() 
{ 
     btnsearchName.ID = "btnsearchName"; 
     btnsearchName.Text = "Search"; 
     btnsearchName.Click += new EventHandler(this.btnsearchName_Click); 

     return btnsearchName; 
} 

public TextBox create_textbox() 
{ 
     TextBox tbsearchByName = new TextBox(); 
     Button btnsearchName = new Button(); 
     tbsearchByName.Width = 250; 
     tbsearchByName.ID = "tbsearchByName"; 
     tbsearchByName.Text = "Enter the full name of a student"; 
     return tbsearchByName; 
} 


protected void btnsearchByName_Click(object sender, EventArgs e) 
{ 
    TextBox tbsearchByName = create_textbox(); 
    Button btnsearchName = create_button(); 
    //add to panels 
    pnlsearchStudents.Controls.Add(tbsearchByName); 
    pnlsearchStudents.Controls.Add(btnsearchName); 

    //add to session 
    List<Button> lstbutton = Session["btn"] as List<Button> 
    lstbutton.add(btnsearchName); 
    //similarly add textbox 

    //again add to session 
    Session["btn"] = lstbutton 
} 

public override page_load(object sender, eventargs e) 
{ 
    //fetch from session, the lstButton and TextBox and recreate them 
    List<Button> lstbutton = Session["btn"] as List<Button>; 
    foreach(Button b in lstbutton) 
     pnlsearchStudents.Controls.Add(b); 

    //similar for textbox 

} 
+0

感謝您的幫助,但發生錯誤說'對象引用未設置'發生,我認爲這是由於加載沒有創建會話的按鈕。它如何解決? @Anand – Jivan 2012-08-10 11:33:04

+0

那不是完整的工作代碼。顯然,有些東西我錯過了(就像我從來沒有創建一個List的實例來保存按鈕和文本框)。這只是一個指示如何去做的方向。 – Anand 2012-08-11 05:09:09

0

我不知道,但可能是你必須重寫OnInit的( )這樣的方法。

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
}