通过单击 DataGridView 中的添加按钮添加一行
Adding a row by clicking on the Add button in a DataGridView
我正在开发一个 Windows 表单应用程序,我有一个网格视图,其中列出了在数据库中找到的所有用户。数据库如下所示:
table 用户
table 权限
现在,每个用户只能拥有一个权限,例如 Admin 或 User 等,但我将此信息保存在单独的 table 中,并定义了一个外键约束,最终用户可以'插入具有错误权限的用户,而只是从权限 table.
中找到的用户
顺便说一下,我正在使用 Entity Framework 并且我已经使用数据库优先方法创建了我的模型对象。但这可能不会影响 question/answer 因为我要问的逻辑可能是相同的,无论您如何处理数据库中的数据。
所以,现在,我有两个绑定源,一个叫做 userBidningSource
,另一个是 privilegesBindingSource
。用户模型有一个导航 属性 到权限,反之亦然(这是由 EF 生成的)。现在,我已将用户数据源从“数据源”菜单拖到我的表单中,并编写了一些代码(在我的表单加载中),如下所示:
try{
context.user.Load();
this.userBindingSource.DataSource = context.user.Local.ToBindingList();
}catch(Exception ex){
Debug.Write(ex);
}
现在这有效(我可能忘记添加所有代码,但直到现在一切正常)并且我从用户 table.
获得所有列的所有用户列表
现在因为不安全而且没有意义让最终用户去 choose/guess 应该输入什么 privilege_id 字段,我在该列的网格视图上制作了一个组合框.
所以我在我的代码中添加了这样的东西:
context.privileges.Load();
this.privilegesBindingSource.DataSource = context.user.Local.ToBindingList();
另外,我在设计器中将此列的数据源(右键单击网格视图,然后编辑列)设置为权限数据源。
现在所有下拉菜单都已按应有的方式填充。
问题
最后,问题...现在,我正在尝试添加一个新行。因此,如果我单击网格视图的 + 图标,我会收到一条错误消息:
"DataGridViewComboBoxCell value is not valid. To replace this default
dialog please handle the DataError event."
所以问题是,如何使用当前设置添加一行?我做错了什么?
您需要设置 DisplayMember and the ValueMember 属性,以便在添加新行时,它将使用该知识来填充组合框。您可能还想添加一个方法,以便在请求新行时调用您的处理程序,以便您可以指定新行的默认值。您可以向 DefaultValuesNeeded
事件添加事件处理程序并指定默认值,例如:
private void dataGridView1_DefaultValuesNeeded(object sender,
System.Windows.Forms.DataGridViewRowEventArgs e)
{
e.Row.Cells["Region"].Value = "WA";
e.Row.Cells["City"].Value = "Redmond";
e.Row.Cells["PostalCode"].Value = "98052-6399";
e.Row.Cells["Country"].Value = "USA";
e.Row.Cells["CustomerID"].Value = NewCustomerId();
}
尝试通过转到 dataGridView 属性添加事件 DataError 并保留函数主体 empty/blank。
我正在开发一个 Windows 表单应用程序,我有一个网格视图,其中列出了在数据库中找到的所有用户。数据库如下所示:
table 用户
table 权限
现在,每个用户只能拥有一个权限,例如 Admin 或 User 等,但我将此信息保存在单独的 table 中,并定义了一个外键约束,最终用户可以'插入具有错误权限的用户,而只是从权限 table.
中找到的用户顺便说一下,我正在使用 Entity Framework 并且我已经使用数据库优先方法创建了我的模型对象。但这可能不会影响 question/answer 因为我要问的逻辑可能是相同的,无论您如何处理数据库中的数据。
所以,现在,我有两个绑定源,一个叫做 userBidningSource
,另一个是 privilegesBindingSource
。用户模型有一个导航 属性 到权限,反之亦然(这是由 EF 生成的)。现在,我已将用户数据源从“数据源”菜单拖到我的表单中,并编写了一些代码(在我的表单加载中),如下所示:
try{
context.user.Load();
this.userBindingSource.DataSource = context.user.Local.ToBindingList();
}catch(Exception ex){
Debug.Write(ex);
}
现在这有效(我可能忘记添加所有代码,但直到现在一切正常)并且我从用户 table.
获得所有列的所有用户列表现在因为不安全而且没有意义让最终用户去 choose/guess 应该输入什么 privilege_id 字段,我在该列的网格视图上制作了一个组合框.
所以我在我的代码中添加了这样的东西:
context.privileges.Load();
this.privilegesBindingSource.DataSource = context.user.Local.ToBindingList();
另外,我在设计器中将此列的数据源(右键单击网格视图,然后编辑列)设置为权限数据源。
现在所有下拉菜单都已按应有的方式填充。
问题
最后,问题...现在,我正在尝试添加一个新行。因此,如果我单击网格视图的 + 图标,我会收到一条错误消息:
"DataGridViewComboBoxCell value is not valid. To replace this default dialog please handle the DataError event."
所以问题是,如何使用当前设置添加一行?我做错了什么?
您需要设置 DisplayMember and the ValueMember 属性,以便在添加新行时,它将使用该知识来填充组合框。您可能还想添加一个方法,以便在请求新行时调用您的处理程序,以便您可以指定新行的默认值。您可以向 DefaultValuesNeeded
事件添加事件处理程序并指定默认值,例如:
private void dataGridView1_DefaultValuesNeeded(object sender,
System.Windows.Forms.DataGridViewRowEventArgs e)
{
e.Row.Cells["Region"].Value = "WA";
e.Row.Cells["City"].Value = "Redmond";
e.Row.Cells["PostalCode"].Value = "98052-6399";
e.Row.Cells["Country"].Value = "USA";
e.Row.Cells["CustomerID"].Value = NewCustomerId();
}
尝试通过转到 dataGridView 属性添加事件 DataError 并保留函数主体 empty/blank。