有一个带有一些属性的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? 感谢。
答案 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
界面,例如DataTable
和DataSet
类。
IBindingList
界面,例如BindingList<T>
类。
IBindingListView
界面,例如BindingSource
类。