目前正在努力解决我过去遇到的问题。目前,一个有价值的解决办法逃脱了我,但这似乎是一个显而易见的问题,我不禁想知道我是否应采用“最佳实践”方法。
没有代码,简而言之就是问题:
我已经确认这是问题所在,因为如果您在转发器上为页面加载提供一些静态数据,那么一切正常。但当然这没用,因为它必须动态填充。
这种头痛是否有一种普遍认可的方式?我可以将数据存储在会话中并在页面加载时重新使用它,但它看起来非常笨拙。
干杯, 马特
答案 0 :(得分:2)
如果事件是由转发器中的按钮触发的,那么这将冒泡到转发器ItemCommand事件。使用CommandName和CommandArgument参数按钮,您可以识别单击了哪个按钮并相应地执行操作。下面是一些基本的标记和代码,用于演示方法:
HTML:
<asp:Repeater ID="rptTest" runat="server" onitemcommand="rptTest_ItemCommand"
onitemdatabound="rptTest_ItemDataBound">
<ItemTemplate>
<p>
<asp:Button ID="btnTest" runat="server" />
</p>
</ItemTemplate>
</asp:Repeater>
<asp:Button ID="btnLoad" runat="server" Text="Load" onclick="btnLoad_Click" />
事件背后的代码:
protected void rptTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Button button = (Button)e.Item.FindControl("btnTest");
button.Text = string.Format("Button {0}", e.Item.DataItem.ToString());
button.CommandName = e.Item.ItemIndex.ToString();
}
protected void rptTest_ItemCommand(object source, RepeaterCommandEventArgs e)
{
Response.Write(string.Format("Postback from button {0}", e.CommandName));
}
protected void btnLoad_Click(object sender, EventArgs e)
{
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
rptTest.DataSource = list;
rptTest.DataBind();
}
希望我已经理解了这个问题,这会有所帮助。
答案 1 :(得分:2)
如果您的任何控件是动态创建的,那么必须在回发期间重新创建它们,以便重新启动事件等。
如果是这种情况,请查看control built by a guy named Denis Bauer。我们只需稍加修改就可以使用它,它非常完美。