1

関連するデータ項目を主キー (この場合はユーザーのイニシャル) として使用するバッキング データベースの特定のテーブルを使用しています。これは私には変えられません。それはレガシーなデザインなので、私はそれに固執しています。しかし、それは関連しているため、私が使用している DataGrid に表示する必要があります (ObjectContext を介してデータベースのテーブルにバインドされます)。

残念ながら、これは、ユーザーが既存のレコードのイニシャルを編集しようとすると、このテーブルに対応するエンティティのエンティティ キーを編集しようとしているため、例外がスローされることを意味します。

彼らはその列を編集する必要がなく、実際に編集すべきではないため、通常の状況では、列を読み取り専用としてマークするだけです。問題は、テーブルに新しいレコードを入力できるようにする必要があることですが、列を読み取り専用としてマークすると、「新しい行」にイニシャルを入力できなくなります。また。

「新しい行」のセルを除いて、この列のすべてのセルを読み取り専用にするにはどうすればよいですか?

(または、ここでの私のアプローチ全体は根本的に間違っています-テーブルを変更することはできず、このフィールドは存在し、更新可能ではありませんが、ユーザーが挿入できる必要があることを念頭に置いていますか?)

4

3 に答える 3

1

セルを編集したくないDataGrid.BeginningEdit場合e.Cancel=true(および e.を使用してこれを確認できます)e.ColumnRow properties

于 2012-11-27T09:29:41.813 に答える
1

Ron からの上記の回答は、私の問題の半分を解決しました (どうもありがとうございました!)。ただし、その答えは少し実験して私に来ました-行に添付されたエンティティの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 に答える