以编程方式分配的事件处理程序未显示在HTML onClick属性中

时间:2009-12-18 13:43:23

标签: c# asp.net

我目前遇到的问题是代码隐藏中分配的事件处理程序没有出现在.aspx页面的HTML代码中。下面是执行该操作的代码片段:

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”

我希望听到其他人之前是否遇到过这个问题,并找到了解决方法。感谢。

4 个答案:

答案 0 :(得分:1)

您的按钮可能正在使用按钮的提交行为。尝试为按钮设置“UseSubmitBehavior = false”。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.usesubmitbehavior.aspx

答案 1 :(得分:1)

我能够让这段代码按预期工作。我动态添加4 LinkButton并将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;
}

答案 2 :(得分:1)

当动态创建控件时,你也应该为它们分配Id,否则asp.net会自动为它们分配id,如ctl {somenumber}。此外,您需要在每个回发上重新创建这些控件,否则您的事件处理程序将无法正常工作。

答案 3 :(得分: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

所以.....耶。有点令我难以理解为什么它会像这样工作,但无论如何它都有效......