如何正确绑定数组到datagridview?

时间:2012-11-02 11:53:25

标签: c# .net winforms datagridview

有一个带有一些属性的Dependency类

class Dependency:
{
     public string ArtifactId { get; set; }
     public string GroupId { get; set; }
     public string Version { get; set; }

     public Dependency() {}
}

和ProjectView类:

 class ProjectView:
 {
     public string Dependency[] { get; set; }
        ...
 }

我想将ProjectView类中的Dependencies数组绑定到DataGridView。

 class Editor
 {
     private readonly ProjectView _currentProjectView;

     ... //I skipped constructor and other methods  

     private void PopulateTabs()
     {
        BindingSource source = new BindingSource {DataSource = _currentProjectView.Dependencies, AllowNew = true};
        dataGridViewDependencies.DataSource = source;
     } 
  }

但是当我这样绑定时,会发生异常(AllowNew只能在IBindingList或带有默认公共构造函数的读写列表上设置为true。),因为_currentProjectView.Dependencies是数组,它无法添加新项目。 有解决方案是转换为列表,但它不方便,因为它只是复制和丢失对原始数组的引用。有这个问题的解决方案吗?如何正确绑定数组到datagridview? 感谢。

2 个答案:

答案 0 :(得分:2)

好吧,那么让我们说你的内存中有一些Dependency对象的数组,你做了类似的事情:

arrayOfObjs.ToList();

这不会改变他们指向的参考。因此,为了进一步说明它们来自的数组,如果它存在于内存中,它会看到所做的更改。现在,你会看到任何补充,不是吗?但这就是为什么你使用像List这样的可变类型而不是数组。

所以,我建议你这样做:

class ProjectView:
{
    public string List<Dependency> Dependencies { get; set; }
}

转储数组。如果Dependency的原始列表来自数组,那么只需在其上发出ToList方法并将其转储。当你想要从中取出一个数组时(也许你需要传回一个数组),就这样做:

projectViewObj.Dependencies.ToArray();

这将为您构建Dependency[]

修改

请考虑以下结构:

class ProjectView:
{
    public Dependency[] Dependencies { get; set; }

    public List<Dependency> DependencyList { get { return this.Dependencies.ToList(); } }
}

然后是以下形式:

private void PopulateTabs()
{
   BindingSource source = new BindingSource { DataSource = _currentProjectView.DependencyList, AllowNew = true};
   dataGridViewDependencies.DataSource = source;
}

然后编辑完成时:

_currentProjectView.Dependencies = _currentProjectView.DependencyList.ToArray();

答案 1 :(得分:0)

我认为如果不使用集合,就无法将数组绑定到DataGridView。所以你必须使用这样的东西:

BindingSource source = new BindingSource {DataSource = _currentProjectView.Dependencies, AllowNew = true};

dataGridViewDependencies.DataSource = _currentProjectView.Dependencies.ToList();

来自MSDN

DataGridView类支持标准的Windows窗体数据绑定模型。这意味着数据源可以是实现以下接口之一的任何类型:

  • IList界面,包括一维数组。

  • IListSource界面,例如DataTableDataSet类。

  • IBindingList界面,例如BindingList<T>类。

  • IBindingListView界面,例如BindingSource类。