2011-08-05 17 views
20

tengo una pequeña aplicación en C#, que tiene un DataGridView que se llena usando:¿Cómo ocultar la columna de DataGridView cuando se usa DataSource personalizado?

grid.DataSource = MyDatasource array;

MiClase sostienen la estructura de las columnas, se ve algo como esto:

class MyDatasource 
{ 
    private string column1;   
    private string column2; 

    public MyDatasource(string arg1, string arg2) 
    { 
     this.column1 = arg1; 
     this.column2 = arg2; 
    } 

    public string column1 
    { 
     get 
     { 
      return this.column1; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 

    public string column2 
    { 
     get 
     { 
      return this.column2; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 
} 

Todo funciona bien y DataGridView se completa con los datos correctos, pero ahora quiero ocultar la columna2. Traté de agregar [Browsable(false)] arriba de la declaración de la columna, que lo ocultará, pero también necesito acceder al valor de la columna desde el código, y cuando uso [Browsable(false)] y trato de leer el contenido, actúa como si la columna no existiera. Si no lo uso, puedo leer la columna sin problema, pero está visible en DataGridView.

¿Cómo podría ocultar la columna pero aún así poder leer su contenido del código?

Respuesta

2

Conjunto que Visible propiedad particular de la columna = false

dataGridView[ColumnName or Index].Visible = false;

Editar siento perdió la Columns Propiedad dataGridView.Columns[ColumnName or Index].Visible = false;

31

Usted tiene que ocultar la columna en el control de vista de cuadrícula en lugar de en la fuente de datos. Al ocultarlo en la fuente de datos, no aparecerá en la vista de cuadrícula, por lo tanto, no podrá acceder al valor en la vista de cuadrícula. Si lo hace de la manera que sugiere, tendría que acceder al valor de la columna a través de la fuente de datos en lugar de a la vista de la cuadrícula.

Para ocultar la columna en el control de vista de cuadrícula, puede utilizar código como el siguiente:

dataGridView1.Columns[0].Visible = false; 

Para acceder a la columna desde la fuente de datos, usted podría intentar algo como esto:

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"]; 
+0

'Visible' es "sólo lectura" después de que se crea el control. –

6

No estoy seguro de si es demasiado tarde, pero el problema es que no puede establecer las columnas en modo de diseño si está vinculando en tiempo de ejecución. Por lo tanto, si está vinculando en tiempo de ejecución, continúe y elimine las columnas del modo de diseño y hacerlo pragmáticamente

ex ..

 if (dt.Rows.Count > 0) 
    { 
     dataGridViewProjects.DataSource = dt; 
     dataGridViewProjects.Columns["Title"].Width = 300; 
     dataGridViewProjects.Columns["ID"].Visible = false; 
    } 
35

En algunos casos, podría ser una mala idea añadir primero la columna a la DataGridView y luego ocultarlo.

Por ejemplo, tengo una clase que tiene un proxy NHibernate para una propiedad de imagen para los logotipos de la empresa. Si accedía a esa propiedad (por ejemplo, llamando a su método ToString para mostrarlo en un DataGridView), descargaría la imagen del servidor SQL. Si tuviera una lista de objetos de la Compañía y la utilizara como dataSource de DataGridView así, entonces (sospecho) que descargaría TODOS los logos ANTES de que pudiera ocultar la columna.

Para evitar esto, solía atribuir el encargo

[System.ComponentModel.Browsable(false)] 

en la propiedad de la imagen, de modo que el DataGridView omite la propiedad (no crea la columna y no llama a los métodos ToString).

public class Company 
{ 
    ... 
    [System.ComponentModel.Browsable(false)] 
    virtual public MyImageClass Logo { get; set;} 
+0

Esta es definitivamente la mejor manera de hacerlo si trabaja con una propiedad que sabe que nunca querrá mostrar. – Henry

+1

Esta es la mejor respuesta. Período. – Buddha

+0

La solución más elegante codificador compañero +1 – ChenChi

0

que tenían el mismo problema

Aquí está la solución que podría funcionar para usted. Funcionó para mí

GridView1.DataBind(); 
if (GridView1.Columns.Count > 0) 
    GridView1.Columns[0].Visible = false; 
else 
{ 
    GridView1.HeaderRow.Cells[0].Visible = false; 
    foreach (GridViewRow gvr in GridView1.Rows) 
    { 
     gvr.Cells[0].Visible = false; 
    } 
} 
4

me he dado cuenta de que si se utilizan progrmmatically se hace incompleta (formulario completo, simplemente no se "pinta" nada) si se usa antes de panel1.Controls.Add(dataGridView); continuación dataGridView.Columns["ID"].Visible = false; romperá todo el formulario y hacerlo en blanco, por lo para desplazarse por ese conjunto esto después Ejem:

panel1.Controls.Add(dataGridView); 
dataGridView.Columns["ID"].Visible = false; 
//works 

dataGridView.Columns["ID"].Visible = false; 
panel1.Controls.Add(dataGridView); 
//fails miserably 
Cuestiones relacionadas