0

有一个具有一些属性的依赖类

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 类中的依赖项数组绑定到 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?谢谢。

4

2 回答 2

2

好的,假设你Dependency在内存中的某个地方有一个这些对象的数组,你做了这样的事情:

arrayOfObjs.ToList();

这不会改变他们指向的参考。因此,更进一步,他们来自的数组,如果它持久存在于内存中,它将看到所做的更改。现在,你会看到任何补充,不是吗?但这就是为什么你使用像 a 这样的可变类型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();
于 2012-11-02T12:13:41.443 回答
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

于 2012-11-02T12:28:15.800 回答