Con el control GridView ASP.NET, ¿cómo puedo desactivar los controles o células individuales en un GridViewRow después PageIndexChanged?

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

Pregunta

Tengo un control GridView enlazado de datos, en la que soy capaz de desactivar las células individuales basados ??en el papel del usuario. Esto sólo funciona en la primera página.

private void LimitAccessToGridFields()
    {
        if (User.IsInRole("Processing")) return;

        foreach (GridViewRow gridViewRow in gvScrubbed.Rows)
        {
            var checkBox = ((CheckBox) gridViewRow.FindControl("cbScrubbed"));
            checkBox.Enabled = false;

            // ButtonField does not have an ID to FindControl with
            // Must use hard-coded Cell index
            gridViewRow.Cells[1].Enabled = false; 
        }
    }

Me llaman a este método Page_Load, donde trabaja. Lo he intentado en el PageIndexChaging y controladores de eventos PageIndexChanged, en los que no funciona. Mientras se depura, parece conjunto activado con éxito en false en ambos de los controles en la fila. Mi objetivo es desactivar estos campos, dependiendo del rol del usuario, después de cambiar la página. ¿Cómo debería esto ser realizado?

¿Fue útil?

Solución 2

He encontrado que esto debe hacerse en el controlador de eventos RowDataBound.

if (e.Row.RowType == DataControlRowType.DataRow)
{
   // details elided ...

   // Limits the access to grid fields.
   if (!User.IsInRole("PROCESSING"))
   {
       cbstuff.Enabled = false; // a checkbox
       e.Row.Cells[1].Enabled = false; //a link button
   }
}

Otros consejos

No es necesario iterar a través de los controles Para desactivar u ocultar / visibles.

Todas las células de un control GridView es en realidad una referencia de tabla HTML, cuando se representa (ver el código en su página utilizando la luciérnaga o inspector).

¿Por qué no iterar a través de todas las células, y cualesquiera controles que se encuentran dentro de cada célula, simplemente desactivarlas? O simplemente puede recorrer cada fila de su GridView y desactivar u ocultar directamente, lo que afectará a todo dentro de la fila.

Ocultación usando un ejemplo de referencia de celda de tabla:

foreach (GridViewRow gRow in myGridView.Rows)
            {
                if (gRow.RowType == DataControlRowType.DataRow)
                {
                        TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
                        foreach (TableCell tblCell in tbcCol)
                                tblCell.Enabled = false;
                }
            }

Así que todo lo desactivará celular tabla celda de la tabla.

O .. ¿por qué no desactivar toda la fila?

foreach (GridViewRow gRow in myGridView.Rows)
            {
                if (gRow.RowType == DataControlRowType.DataRow)
                   gRow.Enable = false;
            }

Si necesita punta de alfiler o filtrar determinados tipos de control (casilla de verificación, cuadro de texto, etiquetas, etc.) y sólo afectará a aquellos controles a continuación, simplemente prueba para ellos!

foreach (GridViewRow gRow in myGridView.Rows)
{
  if (gRow.RowType == DataControlRowType.DataRow)
  {
     TableCellCollection tbcCol = (TableCellCollection)gRow.Cells;
     foreach (TableCell tblCell in tbcCol)
         if (((TextBox)tblCell) != null)
             ((TextBox)tblCell).Enable = false;
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top