我正在使用Windows窗体应用程序,我有一个网格视图,其中列出了在数据库中找到的所有用户。数据库看起来像这样:
表用户
表格权限
现在,每个用户只能拥有一个权限,例如Admin或User等,但我将此信息保存在单独的表中,并且以最终用户无法插入用户的方式定义外键约束一个错误的权限,而只是来自Privileges表中的那些权限。
顺便说一下,我正在使用Entity Framework,我使用Database First方法创建了我的Model对象。但这可能不会对问题/答案产生影响,因为无论你如何操纵数据库中的数据,我要问的逻辑可能都是一样的。
所以,现在,我有两个绑定源,一个叫userBidningSource
,另一个叫privilegesBindingSource
。用户模型具有权限的导航属性,反之亦然(这由EF生成)。现在我将用户数据源从“数据源”菜单拖到我的表单中,并编写了一些代码(在我的表单加载中),如下所示:
try{
context.user.Load();
this.userBindingSource.DataSource = context.user.Local.ToBindingList();
}catch(Exception ex){
Debug.Write(ex);
}
现在这个工作了(我可能忘了添加所有代码,但是到目前为止每次都可以使用)并且我得到一个包含Users表中所有列的所有用户的列表。
现在因为它不安全而且让最终用户选择/猜测应该输入什么的privilege_id字段没有意义,我在该列的网格视图上创建了一个组合框。
所以我在我的代码中添加了类似的内容:
context.privileges.Load();
this.privilegesBindingSource.DataSource = context.user.Local.ToBindingList();
此外,我已在设计器中设置此列的数据源(右键单击网格视图,然后编辑列)到权限数据源。
现在所有的下降都应该填充。
问题
最后,问题......现在,我正在尝试添加一个新行。因此,如果我点击网格视图的+图标,我会收到错误消息:
“DataGridViewComboBoxCell值无效。要替换此默认值 对话框请处理DataError事件。“
所以问题是,如何使用当前设置添加行?我做错了什么?
答案 0 :(得分:1)
您需要设置DisplayMember和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();
}
答案 1 :(得分:1)
尝试通过转到dataGridView属性添加事件DataError,并将函数体留空/空白。