用户可以通过 GUI 编辑DataGridView
必须满足哪些条件?例如按F2
进行修改,选择要删除的行或添加新行?
当我将DataGridView.DataSource
绑定到本地集合对象(例如List<T>
)时,我可以执行所有三个操作。
当我将DataGridView.DataSource
绑定到DataTable
或DataView
时,我也能够以图形方式完成所有这三项工作。
但是当我将DataGridView.DataSource
绑定到DbSet<T>.ToList<T>()
或DbSet<T>.ToArray<T>()
(Entity Framework
)时,我只能修改现有行的非主键值,即使我已启用<通过DataGridView向导删除和添加功能,并专门将AllowUserToAddRows
和AllowUserToDeleteRows
设置为true
。运行时,应用程序将不会显示星号符号,表示可以添加新行。也无法删除行。
然而,数据显示正确。
所以,我很困惑。上述数据源的哪些特征可能导致GUI中的不同行为?
由于
答案 0 :(得分:2)
DataGridView
控件允许用户在AllowUserToAddRow
设置为true且基础数据源实现IBindingList
返回AllowNew
为true时添加行。类似的删除规则。
您可以查看AllowUserToAddRowsInternal
和AllowUserToDeleteRowsInternal
内部方法&#39;源代码。
作为结论,这些是基于数据源的允许操作:
List<T>
:修改BindingList<T>
:添加,编辑,删除(对于添加,T
应该有无参数构造函数)Array
:修改DataTable
:添加,修改,删除BindingSource
:取决于BindingSource
的基础数据源。如果它是IBindingList
的实现,则会向它询问,否则如果列表不是FixedSize
则允许所有操作,否则,只允许编辑。因此,例如,如果将List<T>
设置为绑定源的数据源,然后将绑定源设置为数据网格视图的数据源,则允许列表进行所有操作。IBindingList
:请求实施。答案 1 :(得分:0)
1.1对datagridview进行更改......
public void DAL_UpdateStudentsTable(DataTable table) //DAL represents 3-tyer architecture (so data access layer)
{
using (SqlConnection sqlConn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = @"UPDATE Students SET " +
"StudentID = @id, " +
"FirstName = @first, " +
"LastName = @last, " +
"Birthday = @birthday, " +
"PersonalNo = @personal " +
"WHERE StudentID = @oldId";
cmd.Parameters.Add("@id", SqlDbType.Int, 5, "StudentID");
cmd.Parameters.Add("@first", SqlDbType.VarChar, 50, "FirstName");
cmd.Parameters.Add("@last", SqlDbType.VarChar, 50, "LastName");
cmd.Parameters.Add("@birthday", SqlDbType.DateTime, 1, "Birthday");
cmd.Parameters.Add("@personal", SqlDbType.VarChar, 50, "PersonalNo");
SqlParameter param = cmd.Parameters.Add("@oldId", SqlDbType.Int, 5, "StudentID");
param.SourceVersion = DataRowVersion.Original;
cmd.Connection = sqlConn;
using (SqlDataAdapter da = new SqlDataAdapter())
{
da.UpdateCommand = cmd;
da.Update(table);
}
}
}
}