Domanda

Ho una griglia databound con una colonna campo templato che è una casella di controllo. Quando l'utente controlli la casella di controllo, sarà AutoPostBack e aggiornare la riga per indicare lo stato di controllo della scatola.

Il mio primo tentativo è stato di utilizzare semplicemente il metodo di OnCheckedChanged, ma quando questo viene chiamato, non ho modo di sapere quale riga la casella di controllo è venuto da. Così, non quale riga di aggiornamento so.

Qualcuno può suggerire un metodo per determinare quale riga la casella di controllo che ha generato l'evento oncheckedchanged è venuto da? Oppure si può suggerire un modo migliore per ottenere ciò che devo fare?

Non posso legano la casella di controllo per la colonna di dati, perché non voglio che la casella di controllo disattivata in modalità di selezione, e non vogliono richiedere all'utente di accedere alla modalità di modifica per modificare il valore. Ho anche bisogno tutte le righe di essere modificabile. Quindi, la strada migliore sembra essere in una colonna su modelli.

È stato utile?

Soluzione

Si potrebbe trovare la casella di controllo controllato mediante iterazione sulle righe.

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

Questo non è così inefficiente come sembra (quando PageSize della griglia non è troppo alto).

È possibile anche ottenere il via GridViewRow Checkbox.Parent.Parent:

  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

Questo è più veloce come l'opzione 1, ma se si f.e. Sarebbe nido la casella di controllo in una tabella, in futuro, questo non sarebbe più lavorare senza regolazione.

Io normalmente preferisco l'opzione 1, perché in un unico evento-handler millisecondo più o meno non importa.


Aggiorna : ricevendo il GridViewRow tramite NamingContainer è un altro (a mio parere la migliore) l'opzione:

Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)

Questo funziona anche quando si ancora nidificano la casella di controllo all'interno di altri controlli come una tabella.

Altri suggerimenti

Non credo ci sia un modo per fare questo, come indicato senza trattare materialmente i RowEditing, RowUpdating ed eventi RowCancelingEdit.

In alternativa, io suggerirei di aggiungere un CommandField al GridView, in questo modo:

<asp:CommandField ShowSelectButton="true" />

sarà necessario gestire la GridView.SelectedIndexChanging, ancora una volta in questo modo:

    void GridView_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        GridView.SelectedIndex = e.NewSelectedIndex;
    }

Una volta che siete in SelectedIndexChanging, è possibile utilizzare GridView.Rows[e.NewSelectedIndex].FindControl("id") per ottenere il controllo necessario -. Supponendo che questo funcitonality è ancora critica a te

Modifica Ho appena letto l'aggiornamento, e io non sono del tutto sicuro di quello che stai cercando di ottenere qui. Sembra che si ha familiarità con il CommandField. Che cosa volete che il vostro sito web per fare quando si seleziona questa casella di controllo che deve essere fatto in modo indipendente gli Stati fila?

Modifica. 2: object sender Si potrebbe anche lanciare al vostro CheckBox, e trovare il GridRow appropriato utilizzando .Parent(), ma questo si è sempre sentito estremamente hacky a me

Modifica. 3: Giuro, ho intenzione di interrompere la modifica questo alla fine

Non ho mai provato questo, ma si potrebbe ottenere un riferimento CheckBox.ClientID e provare a passare attraverso ogni riga del GridView, e chiamando GridViewRow.FindControl(CheckBox.ClientID). Io davvero non ho idea se questo lavoro sarà, però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top