Estoy tratando de vincular un DataGridView a una matriz de objetos reflejados. Las columnas de encabezado se unen bien, se muestra el nombre correcto y se muestran siete filas, el problema es que las filas están vacías. Ejemplo del programa Cuando reviso los elementos vinculados a datos, se ve bien. Elementos vinculados a datos Muestra que es el modelo reflejado correcto y los valores.

Este es el fragmento que tengo hasta ahora.

private void comboBoxTables_SelectedIndexChanged(object sender, EventArgs e)
{
    var type = (Type)(this.comboBoxTables.SelectedItem as ComboBoxItem).Value;
    object[] result = this.DataLoader.Get(type);

    dataGridView1.DataSource = result;
    this.dataGridView1.Columns.Clear();

    var properties = type.GetProperties();
    foreach (var property in properties)
    {
        this.dataGridView1.Columns.Add(property.Name, property.Name);
        this.dataGridView1.Columns[property.Name].DataPropertyName = property.Name;
    }

    this.dataGridView1.Refresh();
}

Este fragmento:

object[] result = this.DataLoader.Get(type);

Obtiene los datos de un diccionario que contiene los valores reflejados como una matriz de objetos.

En su lugar, intenté usar una fuente de enlace y algunos otros trucos desagradables, pero no puedo hacer que las filas muestren ningún dato.

Cualquier ayuda es muy apreciada, gracias de antemano.

RESUELTO

No estoy seguro de por qué esto resolvió el problema, pero al agregar un ToList() en el resultado, los datos se mostraron correctamente. Podría deberse a un IEnumerable no enumerado anteriormente en el código.

dataGridView1.DataSource = result.ToList();

Expected result

0
Petter Pettersson 16 oct. 2018 a las 17:33

2 respuestas

La mejor respuesta

RESUELTO

No estoy seguro de por qué esto resolvió el problema, pero al agregar un ToList() en el resultado, los datos se mostraron correctamente. Completaré los espacios en blanco una vez que sepa por qué es así.

dataGridView1.DataSource = result.ToList();

Expected result

0
Petter Pettersson 17 oct. 2018 a las 05:55

Intenté recrear su código y el problema real, en mi opinión, es el

var properties = type.GetProperties();

No siendo una propiedad, irónicamente. Lo que significa que no tienen "get {}, set {}" como propiedades normales.

Mi solución es hacer que una clase externa funcione como un "shell" para las propiedades que obtiene de su reflejo:

public class Shell
{
    public string Name { get; private set; }

    public Shell(string name)
    {
        Name = name;
    }
}

Y algo parecido a esto:

    var type = (Type)(this.comboBoxTables.SelectedItem as ComboBoxItem).Value;
    object[] result = this.DataLoader.Get(type);

    //this.dataGridView1.Columns.Clear();

    var properties = type.GetProperties();

    List<Shell> shells = new List<Shell>();
    foreach (var item in properties)
    {
        shells.Add(new Shell(item.Name));
    }

    dataGridView1.DataSource = shells;

    foreach (var property in shells)
    {
        this.dataGridView1.Columns.Add(property.Name, property.Name);
        this.dataGridView1.Columns[property.Name].DataPropertyName = property.Name;
    }

    this.dataGridView1.Refresh();

Editar: Olvidé cambiar la fuente de datos de la cuadrícula de datos a la lista de shells recién creada

0
MaxB 19 oct. 2018 a las 14:20