【发布时间】:2010-08-12 15:27:59
【问题描述】:
与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 方法中的按钮那样进行更改。
我已经运行了调试器并单步执行了代码,看看会发生什么。加载页面时,从PageLoad 调用RenderDataItems 并使用具有“选择此文本”的所有按钮填充面板(因为尚未设置 HiddenField 控件的值 (hdnDataListID)。
第一次单击其中一个按钮时,PageLoad 中的 RenderDataItems 触发,随后是按钮的初始填充,HiddenField 的值设置为 ID,第二次 RenderDataItems 调用发生在在SelectItem 方法中。按钮被清除并重新创建。正确的按钮具有“选定项目”文本。
第二次单击其中一个按钮时,PageLoad 中的 RenderDataItems 会触发,然后是按钮的初始填充,但 SelectItem 方法永远不会触发。
第三次单击其中一个按钮时,会发生与第一次相同的功能。第4个模仿第2个。第 5 次模仿第 1 次。以此类推,以此类推。
当从不包含在面板中的控件中使用EditSelectItem 方法时(它是一个 DataSource 绑定的 GridView 行,带有调用此方法的按钮),它完全符合我的预期并正确设置选定/未选定按钮,每次都调用RenderDataItems 和EditSelectItem 方法。
有什么想法吗?
附:我已经删除了此页面上的所有 AJAX。
【问题讨论】:
标签: c# asp.net .net-2.0 postback