我正在开发一个 Windows 窗体应用程序,并且我有一个网格视图,其中列出了在数据库中找到的所有用户。数据库如下所示:
表用户
表特权
现在,每个用户只能拥有一个权限,例如管理员或用户等,但我将此信息保存在一个单独的表中,并定义了一个外键约束,最终用户无法插入具有错误权限的用户而是仅来自特权表中的那些。
顺便说一句,我使用的是实体框架,并且我已经使用 Database First 方法创建了我的模型对象。但这可能不会影响问题/答案,因为我要问的逻辑可能是相同的,无论您如何处理数据库中的数据。
所以,现在,我有两个绑定源,一个是 called userBidningSource
,另一个是privilegesBindingSource
. 用户模型具有权限的导航属性,反之亦然(这是由 EF 生成的)。现在我已经将用户数据源从数据源菜单拖到我的表单中,并编写了一些代码(在我的表单加载中),如下所示:
try{
context.user.Load();
this.userBindingSource.DataSource = context.user.Local.ToBindingList();
}catch(Exception ex){
Debug.Write(ex);
}
现在这可行(我可能忘了添加所有代码,但直到现在一切正常),我得到了一个包含用户表中所有列的所有用户的列表。
现在因为让最终用户选择/猜测应该输入什么 privilege_id 字段是不安全的并且没有意义,所以我在该列的网格视图上创建了一个组合框。
所以我在我的代码中添加了这样的东西:
context.privileges.Load();
this.privilegesBindingSource.DataSource = context.user.Local.ToBindingList();
我还在设计器中将此列的数据源(右键单击网格视图,然后编辑列)设置为权限数据源。
现在所有下拉菜单都已按应有的方式填充。
问题
最后,问题......现在,我正在尝试添加一个新行。因此,如果我单击网格视图的 + 图标,我会收到一条错误消息:
“DataGridViewComboBoxCell 值无效。要替换此默认对话框,请处理 DataError 事件。”
所以问题是,如何使用当前设置添加一行?我做错了什么?