与此问题类似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
)具有没有设定。)
我第一次单击其中一个按钮,RenderDataItems
从PageLoad
开始,然后按下初始按钮,HiddenField的值设置为ID,第二个{{ 1}}调用是在RenderDataItems
方法中发生的。按钮被清除并重新创建。正确的按钮具有“选定项目”文本。
我第二次单击其中一个按钮时,SelectItem
从RenderDataItems
开始,然后是按钮的初始填充,但PageLoad
方法永远不会触发。
第三次单击其中一个按钮时,第一次发生相同的功能。第四个模仿第二个。第五个模仿第一个。等等,等等。
当使用面板中未包含的控件中的SelectItem
方法时(它是带有调用此方法的按钮的DataSource绑定的GridView行),它完全按照我的预期进行,并正确设置所选/未选中按钮,每次调用EditSelectItem
和RenderDataItems
方法。
有什么想法吗?
P.S。我已经在这个页面上删除了所有的AJAX。
答案 0 :(得分:9)
你应该给你的Button b一个ID。