1

我正在使用后备数据库中的特定表,该表使用相关数据项作为主键(在本例中为用户的姓名首字母)。这是我无法改变的;这是一个遗留设计,所以我坚持下去。但是因为它是相关的,所以它必须显示在我正在使用的 DataGrid 中(通过 ObjectContext 绑定到数据库中的表。)

不幸的是,这意味着当用户尝试编辑现有记录的首字母时,会引发异常,因为他们正在尝试编辑与该表对应的实体的实体键。

这一切都很好,因为他们不需要也确实不应该编辑该列,因此在一般情况下,我只需将该列标记为只读。麻烦的是,我确实需要他们能够在表中输入新记录,但是如果我将该列标记为只读,他们就无法在“新行”中输入首字母。任何一个。

除了“新行”中的单元格之外,如何使该列中的所有单元格为只读?

(或者我在这里的整个方法从根本上被误导了 - 请记住我无法更改表格,并且该字段需要存在并且可由用户插入,尽管不可更新?)

4

3 回答 3

1

如果您不想编辑单元格,我认为您可以处理DataGrid.BeginningEdit事件和设置e.Cancel=true(请参阅:http: //msdn.microsoft.com/en-us/library/system.windows.controls.datagridbeginningediteventargs.aspx )(您可以使用e.Columnand e.Row properties来检查)

于 2012-11-27T09:29:41.813 回答
1

罗恩的上述回答解决了我的一半问题(非常感谢!),另一半首先检测哪些单元格是“新行”的一部分。不过,我通过一些实验得出了这个答案——检查附加到该行的实体的 EntityState 会告诉你,因为当你在“新行”中时它是“分离的”,并更改为“已添加” " 一旦你离开它,但在更改实际保存在 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;
        }
    }
}
于 2012-11-28T20:10:02.793 回答
0

Cerebrate 答案的变体

private void gridData_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        if ((string)e.Column.Header == "Doctor ID")
        {
            if (!e.Row.IsNewItem)
            {
                e.Cancel = true;
            }
        }
    }
于 2017-03-24T17:54:37.947 回答