Case à cocher dans GridView tir CheckedChanged événement au mauvais moment

J'ai une case à cocher dans mon gridview pied de page avec autopostack=true (ce qui devrait tirer un checkedchanged de l'événement), et un linkbutton dans mon itemtemplate (qui doit se déclencher le contrôle gridview rowcommand événement).

Tout a été fonctionne bien, jusqu'à ce que j'ai mis le code suivant dans mon gridview rowdatabound (ou lié aux données) de l'événement:

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

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

Maintenant, lorsque je clique sur mon linkbutton, la case à cocher checkedchanged événement est automatiquement déclenché, puis le rowcommand événement est déclenché.

Pourquoi le checkedchanged événement lancé quand il ne devrait pas, quand j'ai ajouter le code ci-dessus?

Est-il un moyen de contourner ce problème?

Modifier

Voici un exemple, qui reproduit mon problème:

    <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>

Code-behind:

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.");
}

Remarque, je suis la Case true à la propriété dans la RowDataBound - si j'enlève ce, il fonctionne très bien. Afin de fusionner les cellules et le réglage de la case de propriété ne fonctionnent pas bien ensemble.

  • Vous gâcher viewstate. Au lieu de supprimer la ligne de cette façon, envisager de les retirer de la source de données et de reliaison le contrôle gridview.
  • C'est une ligne de pied de page. Je suis en train de fusionner le pied de page cellules...
  • Avez-vous vérifier si la ligne est le pied de page comme if (row.RowType == DataControlRowType.Footer)?
  • Oui, et cette partie est de travailler mes cellules sont fusionnées comme prévu. Mon problème est que la case à cocher est tir de son checkedchanged événement au mauvais moment. (Veuillez lire l'OP...)
  • Êtes-vous créer votre grille de façon dynamique? Si non, pouvez-vous s'il vous plaît poster un balisage pour le contrôle GridView?
  • Non, je ne suis pas la création de mon grille de manière dynamique. J'ai posté le code à reproduire. J'ai réalisé que si je ne définissez pas de la Case cochée bien, il fonctionne aussi très bien.

InformationsquelleAutor Rivka | 2013-10-16