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.
Vous devez vous connecter pour publier un commentaire.
Contrôle GridView événements sont stockés dans le viewstate et ils peuvent obtenir foiré très facilement. Ici, la suppression d'une cellule provoquant de lier les différents cas de bouton de lien. Bien qu'après la publication __EVENTTARGET est LinkButton, mauvaise méthode est appelée et le mal de contrôle, d'événement, les arguments sont passés.
Je vous propose de masquer la cellule plutôt que de l'enlever:
Ce sera la fin.