用户通过 GUI 编辑 DataGridView
必须满足什么条件?比如按F2
修改,选择一行删除,或者新增一行?
当我将 DataGridView.DataSource
绑定(bind)到本地集合对象(例如 List<T>
)时,我能够执行所有三个操作。
当我将 DataGridView.DataSource
绑定(bind)到 DataTable
或 DataView
时,我还能够以图形方式完成这三个操作。
但是当我将 DataGridView.DataSource
绑定(bind)到 DbSet<T>.ToList<T>()
或 DbSet<T>.ToArray<T>()
( Entity Framework
) 时,我只能修改现有行的非主键值,即使我启用了删除和添加通过DataGridView向导函数,具体设置AllowUserToAddRows
和AllowUserToDeleteRows
为true
。运行时,应用程序不会显示表示能够添加新行的星号 符号。删除行也是不可能的。
但是,数据显示正确。
所以,我很疑惑。上述数据源的哪些特征可能导致 GUI 中的不同行为?
谢谢
最佳答案
DataGridView
控件允许用户添加行,如果两者 AllowUserToAddRow
设置为 true 并实现底层数据源 IBindingList
返回 AllowNew
确实如此。类似的删除规则。
可以看看 AllowUserToAddRowsInternal
和 AllowUserToDeleteRowsInternal
内部方法的源代码。
总而言之,这些是基于数据源的允许操作:
-
List<T>
: 编辑 -
BindingList<T>
: 添加、编辑、删除(对于添加,T
应该有无参数构造函数) -
Array
: 编辑 -
DataTable
: 添加、编辑、删除 -
BindingSource
: 取决于BindingSource
的基础数据源.如果它是IBindingList
的实现它从中询问,否则如果列表不是FixedSize
然后允许所有操作,否则,只允许编辑。因此,例如,如果您设置List<T>
作为绑定(bind)源的数据源,然后将绑定(bind)源设置为数据 GridView 的数据源,则允许列表进行所有操作。 -
IBindingList
: 向实现提出要求。
关于C# GUI 可编辑 DataGridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750683/