【发布时间】:2013-03-14 16:04:08
【问题描述】:
如果我递归地遍历页面的控件,则 RowCommand 事件不再由 GridView 中的 LinkButtons 触发。事实上,看起来 GridView 的 ViewState 丢失了。为什么?我该如何解决这个问题?
在您取消注释 //recurse(this.Controls) 行之前,以下代码将正常工作。然后,当您点击链接时,GridView 消失并且 RowCommand 永远不会被触发。
我的页面的完整<body>:
<form id="form1" runat="server">
<asp:GridView ID="gv" AutoGenerateColumns="False" runat="server" onrowcommand="gv_RowCommand">
<Columns><asp:TemplateField HeaderText="Link"><ItemTemplate>
<asp:LinkButton ID="lnk" runat="server" CommandArgument = 'xxx'>xxx</asp:LinkButton>
</ItemTemplate></asp:TemplateField></Columns>
</asp:GridView>
</form>
我的代码:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//recurse(this.Controls);
}
private static void recurse(ControlCollection controls)
{
foreach (Control control in controls)
recurse(control.Controls);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
var dt = new DataTable();
dt.Columns.Add("Link", typeof(string));
DataRow dr = dt.NewRow();
dr["Link"] = "google.com";
dt.Rows.Add(dt);
DataSet ds = new DataSet();
ds.Tables.Add(dt);
gv.DataSource = ds;
gv.DataBind();
}
}
protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (this.Application["counter"] == null)
this.Application["counter"] = 0;
this.Application["counter"] = (int)this.Application["counter"] + 1;
Response.Write("JUNK" + this.Application["counter"]);
}
【问题讨论】:
-
你想用
recurse完成什么? -
在我的真实代码中,我正在按名称搜索一些控件,以便可以适当地设置它们的属性。 OnInit 中的代码正在清除它们。稍后也可以访问它们(在 Page_Load 等中),但那些递归搜索工作正常。
-
你在哪里设置这些控件的属性?如果我们知道您想要达到的目标,您可以为您提供替代解决方案。
-
@Magnus 你不需要真正的递归函数来解释为什么这会导致问题。问题出在我给出的代码中。如果我知道原因,我可能会自己想出一个合理的解决方法。
-
看来你不是唯一一个有这个问题的人,见forums.asp.net/t/1043999.aspx/1