ページのコントロールを再帰的にトラバースすると、GridViewのLinkButtonによって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"]);
}