0

gridview フッターに autopostack=true (checkedchanged イベントを発生させる必要があります) のチェックボックスと、itemtemplate に linkbutton (gridview rowcommand イベントを発生させる必要があります) があります。

gridview rowdatabound (または databound) イベントに次のコードを配置するまで、すべてが正常に機能しています。

        for (int i = 0; i < gridCartRows.Columns.Count - 2; i++)
        {
            e.Row.Cells.RemoveAt(0);
        }

        e.Row.Cells[0].ColumnSpan = gridCartRows.Columns.Count - 1; 

これで、linkbutton をクリックすると、チェックボックスの checkedchanged イベントが自動的に発生し、次に rowcommand イベントが発生します。

上記のコードを追加すると、checkedchanged イベントが発生してはならないのに発生するのはなぜですか?

これを回避する方法はありますか?

編集

私の問題を再現するサンプルは次のとおりです。

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowFooter="True"
        OnRowCommand="GridView1_RowCommand" OnRowDataBound="GridView1_RowDataBound">
        <Columns>
            <asp:TemplateField HeaderText="Column1">
                <ItemTemplate>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Column2">
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButton1" runat="server" Text="Fire Row Command" CommandName="Fire" />
                </ItemTemplate>
                <FooterTemplate>
                    Footer
                    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="CheckBox1_CheckedChanged" />
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Column3">
                <ItemTemplate>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

分離コード:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GridView1.DataSource = new int[5];
        GridView1.DataBind();
    }
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Footer)
    {
        for (int i = 0; i < GridView1.Columns.Count - 2; i++)
        {
            e.Row.Cells.RemoveAt(0);
        }
        e.Row.Cells[0].ColumnSpan = GridView1.Columns.Count - 1;

        ((CheckBox)e.Row.FindControl("CheckBox1")).Checked = true;
    }
}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Fire")
    {
        Response.Write("RowCommand fired.");
    }
}

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
    Response.Write("CheckBox fired.");
}

RowDataBound で CheckBox プロパティを true に設定していることに注意してください。これを削除すると、正常に動作します。そのため、セルのマージとチェックボックス プロパティの設定はうまく連携しません。

4

1 に答える 1