ASP.NET: el valor de GridView se establece en nulo cuando la columna no está visible

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Estoy utilizando una lista de objetos como el origen de datos de mi GridView y cuando configuro las columnas para que no sean visibles, las actualizaciones fallan porque el valor de esas columnas se cambia a nulo (y la columna no permite nulos) . Los valores existen cuando las columnas están visibles, pero realmente no quiero mostrar estas columnas porque, en su mayor parte, son columnas de ID que el usuario no necesita ver.

EDITAR: probé la opción de campo oculto pero aún así establece el valor en nulo. He mirado la fuente de la página y el campo oculto existe con el valor apropiado ...

¿Fue útil?

Solución

Encontré esta solución para simular columnas ocultas en .Net 2.0:

Implementar el evento GridView.RowCreated.

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[1].Visible = false;
    e.Row.Cells[2].Visible = false;
}

Aquí está el enlace: http://www.beansoftware.com/ASP.NET-Tutorials/GridView -Hidden-Column.aspx

Supongo que en 2.0 cuando una columna no es visible, el enlace de datos falla para esa columna, pero este método se oculta después de que se ha establecido el enlace, por lo que engaña al sistema (?).

Otros consejos

Microsoft recomienda usar el DataKeyNames propiedad del control GridView.

En lugar de usar código subyacente para ocultar ciertas columnas, puede eliminar los campos enlazados de GridView y especificarlos en la propiedad DataKeyNames:

<asp:GridView ID="GridView1" runat="server" 
        DataKeyNames="SalesOrderID,SalesOrderDetailID"
        DataSourceID="LinqDataSource1">

De esta forma, los campos no se mostrarán al usuario, pero GridView sabe mantener los valores para actualizar, etc.

Si aún no lo está haciendo, consideraría usar columnas de plantillas para sus datos y hacer " manual " enlace de datos (ya sea " en línea " o en el código detrás de la página usando el evento RowDataBound). De esa manera puede probar DBNull y simplemente ignorar poner un valor en la columna si el valor es NULO. Esto también permitirá que las columnas se oculten correctamente.

Puede hacerlo con campos ocultos para los valores que no desea mostrar. de esa manera, aún puede usar el mismo enlace de datos y otras funciones que usa actualmente.

Cuando un campo dentro de GridView se vuelve invisible, sus valores de celda no son más accesibles o estos son nulos o vacíos.

Para resolver este problema, solo tiene que asignar nombres de columna (Campos ocultos) a la propiedad DataKeyNames de GridView haciendo DataKeyNames = " colName1, colName2, colName3 " .

Luego, acceda a sus valores de celda como cellValue = GridView1.DataKeys [0] [" ID "]. ToString ();

He escrito una publicación simple que demuestra la solución a su problema en aquí .

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