3

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

1 に答える 1

3

@jblは、これを十分に説明できるものを見つけました(検索スキルに感謝します!)。この問題はここで以前に見られました:http://forums.asp.net/t/1043999.aspx/1

そのページを要約すると.Controls、初期化フェーズ中に何らかの方法でGridViewのプロパティにアクセスすると、そのViewStateが破棄されます。理由の説明はありませんが、とにかく観察されています。

そのページには、私にとって十分な回避策があります。各コントロールをチェックして、コントロールが存在するかどうかを確認し、.HasControls()アクセスしない場合はその.Controlsプロパティにアクセスしない場合、ViewStateは失われず、その結果、イベントは正常に発生します。

PSこれはバグだと思いますが、もちろん、下位互換性があるため、これ以上変更することはできません:(

于 2013-03-14T16:54:26.003 に答える