Bestimmen Zeile des Rasters von Templaten Ankreuzfeld Selektion mit Autopostback
-
28-09-2019 - |
Frage
Ich habe ein Databound-Raster mit einer Templat Feld Spalte, die ein Kontrollkästchen ist. Wenn der Benutzer überprüft das Kontrollkästchen, wird es Autopostback und die Zeile aktualisiert die Büchse des Kontrollzustand anzuzeigen.
Mein erster Versuch war, einfach die OnCheckedChanged Methode zu verwenden, aber wenn diese aufgerufen wird, ich habe keine Möglichkeit zu wissen, welche Zeile die Checkbox kam. So, ich weiß nicht, welche Zeile zu aktualisieren.
vorschlagen kann jemand eine Methode, um zu bestimmen, welche Zeile die Checkbox, die das Ereignis ausgelöst oncheckedchanged kam? Oder können Sie eine bessere Art und Weise zu erreichen, was ich tun muss?
Ich kann nicht binden die Checkbox auf die Datenspalte, weil ich nicht möchte, dass die Checkbox in Auswahlmodus deaktiviert, und nicht wollen, damit der Benutzer sich den Bearbeitungsmodus zu geben Sie den Wert zu ändern. Ich brauche auch alle Zeilen bearbeitet werden. So ist der beste Weg scheint in einer Templat Spalte zu sein.
Lösung
Sie könnten der Checkbox finden geprüft von über die Zeilen iterieren.
Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
For Each row As GridViewRow In GridView1.Rows
Dim cb As CheckBox = DirectCast(row.FindControl("MyCheckBoxID"), CheckBox)
If sender Is cb AndAlso cb.Checked Then
'Do something ...'
Exit For
End If
Next
End Sub
Das ist nicht so ineffizient wie es aussieht (wenn das Netz der Seitengröße nicht zu hoch ist).
Sie können auch die GridViewRow über Checkbox.Parent.Parent erhalten:
Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim cb As CheckBox = DirectCast(sender, CheckBox)
Dim row As GridViewRow = DirectCast(cb.Parent.Parent, GridViewRow)
row.BackColor = DirectCast(IIf(cb.Checked, Color.Red, Color.White), Color)
End Sub
Dies ist schneller als Option 1, aber wenn Sie F. E. Would Nest das Kästchen zum Ankreuzen in einer Tabelle in der Zukunft würde dies ohne Anpassung nicht mehr.
Normalerweise würde ich es vorziehen, Option 1, da in einem einer Ereignishandler Millisekunde mehr oder weniger spielt keine Rolle.
Aktualisieren : Erhalten des GridViewRow über NamingContainer ist eine andere (meiner Meinung nach die beste) Option:
Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)
Das auch noch funktioniert, wenn Sie nisten die Checkbox innerhalb anderer Bedienelemente wie eine Tabelle.
Andere Tipps
Ich glaube nicht, dass es eine Möglichkeit, dies ohne den Umgang mit den RowEditing
, RowUpdating
wie gesagt zu tun, und RowCancelingEdit
Ereignissen.
Alternativ würde ich vorschlagen, eine CommandField
zum GridView
hinzufügen, etwa so:
<asp:CommandField ShowSelectButton="true" />
Sie müssen die GridView.SelectedIndexChanging zu handhaben, wieder etwa so:
void GridView_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
GridView.SelectedIndex = e.NewSelectedIndex;
}
Wenn Sie in SelectedIndexChanging
sind, können Sie GridView.Rows[e.NewSelectedIndex].FindControl("id")
verwenden, um die Kontrolle zu bekommen Sie brauchen -. Diese funcitonality vorausgesetzt, Sie immer noch kritisch ist
Edit: Ich habe gerade gelesen das Update, und ich bin nicht ganz sicher, was Sie versuchen, hier zu erreichen. Es klingt wie Sie mit dem CommandField
vertraut sind. Was wollen Sie Ihre Website zu tun, wenn Sie dieses Kontrollkästchen aktivieren, die unabhängig voneinander die Zeile Staaten?
Bearbeiten. 2: Sie können auch werfen object sender
zu Ihrem CheckBox
und finden Sie die entsprechende GridRow
.Parent()
verwenden, aber das war schon immer extrem Hacky fühlte mich
Bearbeiten. 3: Ich schwöre, ich werde schließlich Bearbeitung dies stoppen
Ich habe nie versucht, diese, aber man konnte einen Verweis auf CheckBox.ClientID
und versucht, in der Gridview durch jede Zeile gehen und ruft GridViewRow.FindControl(CheckBox.ClientID)
. Ich habe wirklich keine Ahnung, ob dies funktionieren wird, aber.