WPF Datagrid:除了新行之外的所有行中只有一列 - 如何?

时间:2012-11-27 00:19:40

标签: wpf entity-framework wpfdatagrid

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

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

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

如何将此列中的所有单元格设为只读以外的“新行”中的单元格?

(或者我的整个方法从根本上被误导了 - 记住我不能改变表格,这个字段需要存在并且可以被用户插入,虽然不可更新?)

3 个答案:

答案 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;
            }
        }
    }