2010-03-12 12 views
8

Ni siquiera estoy seguro de si estoy haciendo esto correctamente. Pero básicamente tengo una lista de objetos que están construidos a partir de una clase. A partir de ahí, estoy vinculando la lista a una vista de cuadrícula de datos que está en Windows Form (C#)Databind Lista de objetos a WinForms DataGridView, pero no mostrar ciertas propiedades públicas

A partir de ahí, muestra todas las propiedades públicas del objeto, en la vista de cuadrícula de datos. Sin embargo, hay algunas propiedades que aún necesito acceder desde otras partes de mi aplicación, pero realmente no es necesario que estén visibles en DataGridView.

Entonces, ¿hay algún atributo o algo similar que pueda escribir sobre la propiedad para excluir que se muestre?

P.S. Estoy vinculando en tiempo de ejecución. Entonces no puedo editar las columnas a través del diseñador.

P.P.S. Por favor, no hay respuestas de solo hacer variables públicas (aunque si esa es la única forma, házmelo saber :)).

+3

Puede deshabilitar 'DataGridView.AutoGenerateColumns' (http://goo.gl/41qt) y agregar las columnas requeridas dinámicamente. Realmente no entiendo cuando dices "... Estoy vinculando en tiempo de ejecución. Así que no puedo editar las columnas a través del diseñador". – Vivek

+0

Lo que digo es. No estoy usando el diseñador y el enlace a una fuente de datos. Simplemente estoy escribiendo: datagridview.datasource = mylist; – MindingData

+0

Quizás pueda decirnos por qué está vinculando en tiempo de ejecución en lugar de a través del diseñador. Eso podría ayudar –

Respuesta

14

Añadir [Browsable(false)] atributo a las propiedades públicas que no desea generar columna para.

+1

+1 Si tan solo agregar esto funciona, ¡esto es mucho mejor que mi respuesta! :-) – Javier

+0

nice Lo he probado, funciona =) Intentaba hacer esto agregando mis clases personalizadas. ¡Gracias! – Javier

2

Debía contestar igual que @Vivek says en su comentario. No sé por qué Dejase't añadir una respuesta aquí ...

Bueno, si se deja un control DataGridView para auto generar sus columnas, que muestra todas las propiedades de los objetos encuadernados. Entonces, antes que nada, debe activar DataGridView.AutoGenerateColumns = false.

Luego puede agregar columnas en tiempo de ejecución. Por ejemplo:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn(); 
myColumn.DataPropertyName.HeaderText = "Title of the column"; 
myColumn.DataPropertyName = "NameOfTheProperty"; 

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

Agregar todo manualmente es probablemente mi último recurso aquí. – MindingData

+0

Entonces, tengo una idea, pero es demasiado grande, la pondré en otra respuesta. – Javier

+1

Olvídate de esta segunda idea. Ver la respuesta de @Vivek en su lugar = P – Javier

0

Además de mi respuesta anterior, ya que se prefiere para indicar no agregar las columnas de forma manual, lo que sugiere otra opción: Atributos usando personalizado en su definición propiedades.

En primer lugar, usted tiene que codificar su atributo personalizado:

clase MyPropertyAttribute

Usted podría utilizarlo en sus clases, al igual que este:

clase Foo

public class Foo 
{ 
    private string name; 
    private string surname; 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)] 
    public string Surname 
    { 
     get 
     { 
      return surname; 
     } 
     set 
     { 
      surname = value; 
     } 
    } 

} 

Puede escribir un método que itere las propiedades de los objetos vinculados mediante reflexión y pruebe si están marcados como visibles o invisibles para agregar o no agregar columnas. Incluso podría tener un DataGridView personalizado con este comportamiento, por lo que no tiene que repetir esto cada vez. Solo usará su DataGridView personalizado y marcará la visibilidad en las propiedades.

Algo como esto ...

public class MyCustomDataGridView : DataGridView 
    { 

     public MyCustomDataGridView() 
     { 
      this.AutoGenerateColumns = false; 
     } 

     public void Load<T>(ICollection<T> collection) 
     { 

      foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true)) 
      { 
       if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible) 
       { 
        //... 
       } 
      } 

     } 

    } 
0

Sé que es un poco de una publicación anterior, pero para mayor claridad, deseo agregar que esto también se puede lograr definiendo la definición de tipo personalizado utilizando la interfaz ICustomTypeDescriptor. Parece un poco más de trabajo, pero solo puede implementar lo que necesita (en este caso GetProperties). Hace las cosas más fáciles más adelante porque la mayoría de las listas de grillas/listas de grillas auto-gen admiten este enfoque.

Cuestiones relacionadas