2008-09-24 14 views
34

Estoy tratando de vincular un List<T> a un control DataGridView, y no estoy teniendo suerte creando enlaces personalizados.winForms + enlace DataGridView a una lista <T>

que he intentado:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode")); 

lanza una excepción, diciendo que no se encontró nada con ese nombre propiedad.

El nombre de la columna en cuestión es "Opcode". El nombre de la propiedad en el List<T> es Opcode.

RESPUESTA EDIT: el problema era que no tenía los campos enlazables en mi clase como propiedades, solo campos públicos ... Aparentemente no se refleja en los campos, solo en las propiedades.

+0

LOL que es justo lo que había añadido en mis comentarios, contenta de que se resolvió su problema. –

+2

+1 Acabo de tener el mismo problema. Hombre que chupa bolas! –

+0

Eres un regalo del cielo. He estado golpeando mi cabeza contra este problema durante seis horas seguidas, ahora. Intenté todo lo que pude pensar y todo lo que pude pensar en Google. Sin suerte. Finalmente encontré tu publicación y, por supuesto, tenía prisa y los convertí en campos, no en propiedades. – Locke

Respuesta

14

¿La propiedad de la cuadrícula es también vinculante para Opcode? .. si desea vincular directamente a List, simplemente DataSource = list. Los enlaces de datos permiten un enlace personalizado. ¿Estás tratando de hacer algo más que el origen de datos?

¿Está recibiendo un montón de filas vacías? ¿las columnas generadas automáticamente tienen nombres? ¿Has verificado que los datos están en el objeto (no solo en string.empty)?

class MyObject 
    { 
     public string Something { get; set; } 
     public string Text { get; set; } 
     public string Other { get; set; } 
    } 

    public Form1() 
    { 
     InitializeComponent(); 

     List<MyObject> myList = new List<MyObject>(); 

     for (int i = 0; i < 200; i++) 
     { 
      string num = i.ToString(); 
      myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num }); 
     } 

     dataGridView1.DataSource = myList; 
    } 

esto debería funcionar bien ...

+0

Sí. Si acabo de hacer DataSource = list, obtengo un montón de columnas vacías. – FlySwat

+1

Entonces, ¿solo quiere vincular la cuadrícula a la propiedad opcode en una lista de objetos personalizados? –

+0

Si lo que pregunté es el reparto, entonces hazlo ... Grid.DataSource = MyList.Select (o => o.Opcode); –

5

realmente no puede decir lo que estás tratando de hacer con el ejemplo que haya incluido, pero se une a una lista genérica de objetos es bastante sencillo si que desea es una lista de los objetos:

private BindingSource _gridSource; 

    private BindingSource GridSource 
    { 
     get 
     { 
      if (_gridSource == null) 
       _gridSource = new BindingSource(); 
      return _gridSource; 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     List<FluffyBunny> list = new List<FluffyBunny>(); 
     list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" }); 
     list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" }); 
     list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" }); 

     GridSource.DataSource = list; 
     dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column 
     dataGridView1.DataSource = GridSource; 

    } 

Si sólo desea mostrar propiedades específicas del tipo de la lista que debe ser capaz de hacer que la columna (s) deseado invisible.

Técnicamente, realmente no necesitas crear BindingSource, pero me parece mucho más fácil cuando realizo actualizaciones o cambios si lo tengo.

Espero que esto ayude.

+0

Al enlazar directamente a la Lista , obtengo un montón de filas vacías, sin datos. La clase en la lista contiene 3 cadenas. – FlySwat

+0

Gracias Jared! Su comentario sobre BindingSource realmente me ayudó cuando estaba tratando de descubrir cómo crear nuevas filas al usar una lista . ¡Haz clic! –

+0

+1 para datos interesantes – SteveCav

4

Tenía el mismo problema ... Obviamente tenía una estructura con campos públicos. nada en la grilla proporcionado getters públicos, funcionó.

+0

¡Trabajó para mí! Tks – Pascal

3

Otra solución que he encontrado es usar la colección BindingList.



private void Form1_Load(object sender, EventArgs e) 
{ 
    BindingList people= new BindingList { 
    new Person {Name="John",Age=23}, 
    new Person {Name="Lucy",Age=16} 
    }; 

    dataGridView1.DataSource= people; 
} 

Funciona bien para mí,

Cuestiones relacionadas