类似于这个问题,ASP.Net动态命令按钮事件不会触发,但问题略有不同.
下面提供的是我的代码的(非常)精简版本.
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
并使用"选择此文本"的所有按钮填充面板(因为hdnDataListID
尚未设置HiddenField控件的值()).
我第一次单击其中一个按钮,RenderDataItems
来自PageLoad
触发,然后是按钮的初始填充,HiddenField的值设置为ID,第二次RenderDataItems
调用从SelectItem
方法中发生.按钮被清除并重新创建.正确的按钮具有"选定项目"文本.
我第二次单击其中一个按钮,RenderDataItems
来自PageLoad
触发,然后是按钮的初始填充,但该SelectItem
方法永远不会触发.
第三次单击其中一个按钮时,第一次发生相同的功能.第四个模仿第二个.第五个模仿第一个.等等等等.
当使用EditSelectItem
未包含在面板中的控件中的方法时(它是一个DataSource绑定的GridView行,带有调用此方法的按钮),它完全按照我的预期进行操作并正确设置所选/未选中的按钮,同时调用RenderDataItems
和EditSelectItem
每次都是这个方法.
有任何想法吗?
PS我已经删除了这个页面上的所有AJAX.
你应该给你的Button b一个ID.