我正在使用支持数据库中的特定表,该表使用相关数据项作为主键(在本例中为用户的首字母)。这是我无法改变的;这是一个传统的设计,所以我坚持下去。但是因为它是相关的,它必须在我正在使用的DataGrid中显示(通过ObjectContext绑定到数据库中的表。)
不幸的是,这意味着当用户尝试编辑现有记录的首字母时,会抛出异常,因为他们正在尝试编辑与该表对应的实体的实体密钥。
这一切都很好,因为他们不需要也不应该编辑该列,因此在一般情况下,我只是将列标记为只读。麻烦的是,我确实需要它们能够在表中输入新记录,但如果我将列标记为只读,则它们不能在“新行”中输入首字母。任
如何将此列中的所有单元格设为只读除以外的“新行”中的单元格?
(或者我的整个方法从根本上被误导了 - 记住我不能改变表格,这个字段需要存在并且可以被用户插入,虽然不可更新?)
答案 0 :(得分:1)
我认为您可以处理DataGrid.BeginningEdit
事件并设置e.Cancel=true
(请参阅:http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridbeginningediteventargs.aspx),如果您不想编辑单元格(可以使用{{1}和e。e.Column
检查这个)
答案 1 :(得分:1)
Ron的上述答案解决了我的一半问题(非常感谢!),另一半正在检测哪些细胞属于"新行"首先。但是,这个答案通过一些实验来找我 - 检查附加到该行的实体的EntityState将告诉您,因为它是" Detached"当你进入"新行",并更改为"添加"一旦你离开它,但实际上在ObjectContext上保存了更改之前(此时实体键列仍然可以自由编辑而不会导致错误)。
因此,实现这一目标的代码如下:
private void userDataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
if ((string)e.Column.Header == "Initials")
{
// If this is the new row, entity is not yet attached to the context.
if (
(((User)e.Row.Item).EntityState != EntityState.Detached) &&
(((User)e.Row.Item).EntityState != EntityState.Added))
{
e.Cancel = true;
}
}
}
答案 2 :(得分:0)
Cerebrate回答的变体
private void gridData_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
if ((string)e.Column.Header == "Doctor ID")
{
if (!e.Row.IsNewItem)
{
e.Cancel = true;
}
}
}