我正在尝试将DataGridView绑定到反射对象数组。标题列绑定良好,显示正确的名称并显示七行,问题是行为空。 当我检查数据绑定项目时,它看起来还不错。 它表明它是正确的反映模型和值。
这是我到目前为止的摘录。
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();
答案 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()