将DataGridView绑定到反射对象数组

时间:2018-10-16 14:33:53

标签: c# winforms reflection datagridview

我正在尝试将DataGridView绑定到反射对象数组。标题列绑定良好,显示正确的名称并显示七行,问题是行为空。 Example from the program 当我检查数据绑定项目时,它看起来还不错。 Databound items 它表明它是正确的反映模型和值。

这是我到目前为止的摘录。

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();
}

此代码段:

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

从包含反射值的字典中获取数据作为对象数组。

我尝试使用绑定源和其他一些丑陋的方法,但是我无法使行显示任何数据。

非常感谢您的帮助,谢谢。

已解决

不确定为什么可以解决此问题,但是通过在结果上添加ToList(),可以正确显示数据。可能是由于代码前面的IEnumerable未被枚举。

dataGridView1.DataSource = result.ToList();

Expected result

2 个答案:

答案 0 :(得分:0)

我试图重新创建您的代码,我认为真正的问题是

var properties = type.GetProperties();
具有讽刺意味的是,

不是财产。意味着他们没有“ get {},set {}”作为常规属性。

我的解决方案是使外部类充当从反射中获得的属性的“外壳”:

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

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

以及类似的内容:

    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();

编辑:忘记将datagrid数据源更改为新创建的shell列表

答案 1 :(得分:0)

已解决

不确定为什么可以解决此问题,但是通过在结果上添加public interface PetRepository<Pet, S> extends CouchbasePagingAndSortingRepository<Pet, String> { List<Pet> findAllByTypeAndColorNull(String type); List<Pet> findAllByTypeAndColorIsNull(String type); List<Pet> findAllByTypeAndColorFalse(String type); ,可以正确显示数据。一旦知道为什么会这样,我将填补空白。

ToList()

Expected result