La determinación de fila de la rejilla de selección casilla de verificación de plantilla con AutoPostBack

StackOverflow https://stackoverflow.com/questions/4082607

Pregunta

Tengo una cuadrícula de enlace de datos con una columna de campo de plantilla que es una casilla de verificación. Cuando los controles de usuario en la casilla, se AutoPostBack y actualizar la fila para indicar el estado de verificación de la caja.

Mi primer intento fue simplemente usar el método OnCheckedChanged, pero cuando esto se llama, no tengo manera de saber qué fila de la casilla de verificación de procedencia. Por lo tanto, no sé qué fila de actualización.

Puede alguien sugerir un método para determinar qué fila de la casilla de verificación que generó el evento OnCheckedChanged vino? O puede sugerir una mejor manera de lograr lo que tengo que hacer?

No puedo unen la casilla de verificación a la columna de datos porque no quiero que la casilla de verificación desactivada en el modo de selección, y no desean para requerir al usuario que introduzca el modo de edición para cambiar el valor. También necesito todas las filas para ser editable. Por lo tanto, la mejor ruta parece estar en una columna con plantilla.

¿Fue útil?

Solución

Se puede encontrar el marcar la opción iterando sobre las filas.

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

Esto no es tan ineficiente ya que parece que (cuando PageSize de la red no es demasiado alta).

También puede obtener el GridViewRow través 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

Esto es más rápido que la opción 1, pero si F. E. Would nido la casilla de verificación en una tabla en el futuro, esto no funcionaría más sin ajuste.

Normalmente prefiere la variante 1, ya que en un solo controlador de eventos milisegundo más o menos no importa.


Actualizar : conseguir el GridViewRow a través de NamingContainer es otro (el mejor en mi opinión) opción:

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

Esto incluso todavía funciona cuando el nido de casilla de verificación dentro de otros controles, como una mesa.

Otros consejos

No creo que hay una manera de hacer esto como se ha dicho, sin la manipulación de los RowEditing, RowUpdating y eventos RowCancelingEdit.

Por otra parte, me gustaría sugerir la adición de un CommandField a la GridView, así:

<asp:CommandField ShowSelectButton="true" />

Tendrá que manejar la GridView.SelectedIndexChanging, de nuevo, así:

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

Una vez que estás en SelectedIndexChanging, puede utilizar GridView.Rows[e.NewSelectedIndex].FindControl("id") para conseguir el control necesario -. Funcitonality suponiendo que esto sigue siendo fundamental para que

Editar que acabo de leer su actualización, y no estoy del todo seguro de lo que estamos tratando de lograr aquí. Parece que usted está familiarizado con el CommandField. ¿Qué desea su sitio web hay que hacer cuando se marca esta casilla de verificación que se tiene que hacer de forma independiente los Estados fila?

Editar. 2: object sender También puede enviar contenido al CheckBox, y encontrar el GridRow apropiado usando .Parent(), pero esto siempre se ha sentido muy hacky me

Editar. 3: Juro que voy a dejar de editar este tiempo

Nunca he probado esto, pero se puede obtener una referencia a CheckBox.ClientID y tratar de pasar por cada fila de la GridView, y llamando GridViewRow.FindControl(CheckBox.ClientID). Realmente no tengo ni idea de si este trabajo, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top