gpt4 book ai didi

c# - 递归遍历控件在 OnInit 中禁用 GridView RowCommand 并丢失 Viewstate

转载 作者:行者123 更新时间:2023-11-30 16:19:14 26 4
gpt4 key购买 nike

如果我递归遍历页面的控件,GridView 中的 LinkBut​​ton 将不再触发 RowCommand 事件。事实上,看起来 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"]);
}

最佳答案

@jbl 找到了一些对我来说足够好的解释(感谢搜索技巧!)。这个问题以前在这里见过:http://forums.asp.net/t/1043999.aspx/1

总结该页面,在 Init 阶段以任何方式访问 GridView 的 .Controls 属性都会破坏其 ViewState。没有解释为什么,但无论如何都观察到了。

该页面上有一个对我来说足够好的解决方法。如果您检查每个控件以查看它是否 .HasControls() 并且如果没有则不访问其 .Controls 属性,则 ViewState 不会丢失,因此事件将正常触发。

附言我猜这是一个错误,但当然,由于向后兼容,它不能永远改变 :(

关于c# - 递归遍历控件在 OnInit 中禁用 GridView RowCommand 并丢失 Viewstate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15414284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com