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.

War es hilfreich?

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?

getan werden muss,

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top