ASP.NET动态命令按钮仅每隔一次触发一次

时间:2010-08-12 15:27:59

标签: c# asp.net .net-2.0 postback

与此问题类似ASP.Net Dynamic Command Button Event Not Firing,但问题略有不同。

以下是我的代码的(非常)精简版本。

    protected void Page_Load(object sender, EventArgs e)
    {
        RenderDataItems();
    }

    private void RenderDataItems()
    {
        pnlDataItems.Controls.Clear()
        DataTable dt = MyClass.GetAllData();

        foreach (DataRow dr in dt.Rows)
        {
            Button b = new Button();
            b.Command += new CommandEventHandler(SelectItem);
            b.CommandArgument = dr["ID"].ToString();
            b.ID = "btnData" + dr["ID"].ToString();

            if (hdnDataListID.Value == dr["ID"].ToString())
            {
                b.Text = "Selected Item";
            }
            else
            {
                b.Text = "Pick This Item";
            }
            pnlDataItems.Controls.Add(b);
        }
    }

    private void SelectItem(object sender, CommandEventArgs e)
    {
        hdnDataListID.Value = e.CommandArgument.ToString();
        RenderDataItems();
    }

    private void EditSelectItem(int id)
    {
        MyClass mc = new MyClass(id);
        hdnDataListID.Value = mc.ID.ToString();
        RenderDataItems();
    }

方法SelectItem仅由RenderDataItems方法中呈现的按钮控件调用。 EditSelectItem由动态创建的单独控件调用,但不需要更改RenderDataItems方法中的按钮所需。

我运行调试器并逐步完成代码,看看会发生什么。加载页面时,从RenderDataItems调用PageLoad并使用“选择此文本”的所有按钮填充面板(因为HiddenField控件的值(hdnDataListID)具有没有设定。)

我第一次单击其中一个按钮,RenderDataItemsPageLoad开始,然后按下初始按钮,HiddenField的值设置为ID,第二个{{ 1}}调用是在RenderDataItems方法中发生的。按钮被清除并重新创建。正确的按钮具有“选定项目”文本。

我第二次单击其中一个按钮时,SelectItemRenderDataItems开始,然后是按钮的初始填充,但PageLoad方法永远不会触发。

第三次单击其中一个按钮时,第一次发生相同的功能。第四个模仿第二个。第五个模仿第一个。等等,等等。

当使用面板中未包含的控件中的SelectItem方法时(它是带有调用此方法的按钮的DataSource绑定的GridView行),它完全按照我的预期进行,并正确设置所选/未选中按钮,每次调用EditSelectItemRenderDataItems方法。

有什么想法吗?

P.S。我已经在这个页面上删除了所有的AJAX。

1 个答案:

答案 0 :(得分:9)

你应该给你的Button b一个ID。