CheckBox in GridView feuern CheckedChanged-event zur falschen Zeit
Ich habe eine checkbox in meine gridview Fußzeile mit autopostack=true (das Feuer sollte eine checkedchanged-Ereignis), und einem linkbutton in meinem itemtemplate (das Feuer sollte das gridview-rowcommand Ereignis).
Alles hat wunderbar funktioniert, bis ich platziert den folgenden code in meinem gridview rowdatabound (oder Datenbindung) - Ereignis:
for (int i = 0; i < gridCartRows.Columns.Count - 2; i++)
{
e.Row.Cells.RemoveAt(0);
}
e.Row.Cells[0].ColumnSpan = gridCartRows.Columns.Count - 1;
Nun, wenn ich auf mein linkbutton, das Kontrollkästchen checkedchanged-Ereignis wird automatisch ausgelöst, und dann die rowcommand-Ereignis ausgelöst wird.
Warum ist das checkedchanged-event wird gefeuert, wenn es nicht sollte, wenn ich den oben genannten code?
Gibt es eine Möglichkeit dies zu umgehen?
Bearbeiten
Hier ist ein Beispiel, reproduziert, dass mein Problem:
<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.");
}
Hinweis, ich werde die CheckBox-Eigenschaft auf true in der RowDataBound - wenn ich diese entfernen, es funktioniert gut. So verschmelzen der Zellen und Einstellung der checkbox-Eigenschaft arbeiten nicht gut zusammen.
- Sie sind Durcheinander viewstate. Anstelle des Entfernens Zeile in dieser Art und Weise, in Erwägung ziehen, von datasource und neubindung des gridview-Steuerelements.
- Dies ist eine Fußzeile. Ich versuche das Zusammenführen der Fußzeile Zellen...
- Haben Sie überprüft, ob die Zeile Fußzeile wie
if (row.RowType == DataControlRowType.Footer)
? - Ja, und das Teil funktioniert - meine-Zellen zusammengeführt werden, wie erwartet. Mein Problem ist, dass das Kontrollkästchen aktiviert ist, brennen seine checkedchanged-event zur falschen Zeit. (Bitte Lesen Sie OP...)
- Erstellen Sie Ihre grid-dynamisch? Wenn nicht, können Sie bitte post-markup für das GridView?
- Nein, ich bin nicht mein grid dynamisch. Ich geschrieben code zu reproduzieren. Ich erkannte, wenn ich nicht setzen Sie die CheckBox checked-Eigenschaft es funktioniert auch einwandfrei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
GridView-Control-Ereignisse werden gespeichert in viewstate und Sie können Durcheinander geraten sehr leicht. Hier, das entfernen einer Zelle verursacht, zu binden, verschiedene event-link Taste. Obwohl nach dem postback __EVENTTARGET ist LinkButton falsche Methode aufgerufen wird, und falsch, Kontrolle, Ereignis-Argumente übergeben werden.
Ich würde vorschlagen, zu verstecken die Zelle, anstatt es zu entfernen:
Diese wird dem Zweck dienen.