2009-12-18 19 views
1

我目前遇到在代碼隱藏中分配的事件處理程序問題,該問題未出現在.aspx頁面的HTML代碼中。下面是這樣的代碼片段:以編程方式指定的事件處理程序不會在HTML onClick屬性中顯示

HtmlTable table = new HtmlTable(); 
HtmlTableRow row = new HtmlTableRow(); 

foreach(XmlNode item in IDList) 
{ 
    LinkButton btn = new LinkButton(); 
    btn.Text = item.InnerText; 
    btn.Click += new EventHandler(btn_Click); 

    HtmlTableCell cell = new HtmlTableCell(); 
    cell.Controls.add(btn); 
    row.cells.add(cell); 
} 

table.rows.add(row); 

類似的東西,或多或少。所以,當我運行該頁面並使用FireBug檢查按鈕時,我注意到創建的按鈕的事件處理程序名稱已更改爲LinkBut​​tons的唯一ID(ct125,126,127等),我認爲,而不是「btn_Click」

我希望聽到其他人是否遇到過這個問題,並找到解決方案。謝謝。

回答

1

我能得到這個代碼按預期運行。我動態地添加4 LinkButton s並將Click事件連接到函數btn_Click。當我點擊的各個環節,他們所謂的btn_Click方法服務器端:

protected void Page_Load(object sender, EventArgs e) 
{ 
    HtmlTable table = new HtmlTable(); 
    HtmlTableRow row = new HtmlTableRow(); 

    for (int loop = 1; loop < 5; loop++) 
    { 
     LinkButton btn = new LinkButton(); 
     btn.Text = "Test " + loop.ToString(); 
     btn.Click += new EventHandler(btn_Click); 

     HtmlTableCell cell = new HtmlTableCell(); 
     cell.Controls.Add(btn); 
     row.Cells.Add(cell); 
    } 

    table.Rows.Add(row); 

    // Add the table to a placeholder. 
    phInputs.Controls.Add(table); 
} 

protected void btn_Click(object sender, EventArgs e) 
{ 
    // Do something to catch a breakpoint. 
    var x = 10; 
} 
1

如果動態地創建控件,你應該給它們編號也,否則asp.net會自動分配他們像CTL {} somenumber IDS。另外,您需要在每次回發時重新創建這些控件,否則您的事件處理程序將無法工作。

1

好的,我弄明白了,但是我爲什麼以這種方式修復這個問題而感到非常困惑。

{ 
    HtmlTable table = new HtmlTable(); 
    HtmlTableRow row = new HtmlTableRow(); 
    int btnIndex = 0; 

    foreach(XmlNode item in IDList) 
    { 
     LinkButton btn = new LinkButton(); 
     btn.Text = item.InnerText; 
     btn.Click += new EventHandler(btn_Click); 
     btn.ID = "Btn_Page" + btnIndex.ToString(); 

     HtmlTableCell cell = new HtmlTableCell(); 
     cell.Controls.add(btn); 
     row.cells.add(cell); 
    } 

    table.rows.add(row); 
} 

protected void Btn_Page_0(object sender, EventArgs e) 
{ 
    whatever eventhandler code 
} 

當我再次檢查HTML時,分配給按鈕的事件處理程序的名稱仍然被更改爲其ID。

<a id="Btn_Page_0" href="javascript:_doPostback('Btn_Page_0','')"> 

因此爲每個按鈕,它們的事件處理程序改爲Btn_Page_0Btn_Page_1Btn_Page_2

奇怪的是,他們都回到Btn_Page_0事件處理程序點擊時,而不是btn_click

所以......是的。有點讓我難以置信的是,爲什麼它能像這樣工作,但它無論如何起作用......

相關問題