0

何時間ものグーグルで見逃したこれに対する簡単な答えがあることを願っています...

データベースからレコードを表示および追加/削除/編集する必要がある DataGridView があります。私は Entity Framework を使用しているため、レコードは最初は EntitySet です。

  • 試行 1

BindingSource には並べ替え機能がありますが、DataSource が EntitySet の場合、実際には利用できないようです。

  • 試行 2

グリッドにカスタム ソートを実装してみてください。ただし、グリッドがデータバインドされている場合、カスタム ソートは許可されません。

  • 試行 3

データに対して Linq クエリを実行し、そこで order 関数を使用します。これは注文したデータを取得するために機能しますが、AllowNew が false に変更されました。強制的に元に戻すことはできますが、DataGridView に追加されたレコードが EntitySet に追加されません (奇妙なことに、すべての更新が反映されます)。

  • 試行 4

#3 のとおりですが、BindingSource の AddingNew イベントを処理し、オブジェクトを明示的に作成して EntitySet に追加します。これは、ユーザーがグリッドの下部にある新しいエントリ行を入力すると、デフォルト値でいっぱいの行がデータベースに追加されることを除いて機能します。ユーザーが行を入力し続けると、大量の行が取得されます。だからそれもダメ。

これを行う方法が必要です-確かに、いくつかのデータベースレコードをグリッドに表示し、完全な編集を許可することは、最も基本的な要件です(行をランダムな順序で表示することはあまり役に立ちません)?

最も感謝して受け取った助け...

4

1 に答える 1

0

これを行うためのより良い方法についてのアドバイスは引き続き歓迎しますが、次の方法でうまくいくようです。

BindingList の派生を作成して LINQ から返されたレコードをラップし、それを ObjectContext と EntityCollection に渡します。AddNewCore と CancelNew をオーバーライドしてオブジェクトをデータベースと BindingList に配置し、フォーカスを一番下の行に移動しても何も書き込まない場合、不要な空白行なしで変更を保持するようです。

class LinqEntityBinding<T> : System.ComponentModel.BindingList<T> 
    where T : System.Data.Objects.DataClasses.EntityObject
{
    public LinqEntityBinding(
        System.Data.Objects.ObjectContext context,
        System.Data.Objects.DataClasses.EntityCollection<T> collection,
        IList<T> list)
        : base(list)
    {
        _context = context;
        _collection = collection;
    }
    System.Data.Objects.ObjectContext _context;
    System.Data.Objects.DataClasses.EntityCollection<T> _collection;

    protected override object AddNewCore()
    {
        object obj = base.AddNewCore();
        _collection.Add((T)obj);
        return obj;
    }

    public override void CancelNew(int itemIndex)
    {
        object obj = Items[itemIndex];
        _collection.Remove((T)obj);
        if (((T)obj).EntityState != System.Data.EntityState.Detached)
        {
            _context.DeleteObject(obj);
        }
        base.CancelNew(itemIndex);
    }
}

次に、代わりに:

bindingSource.DataSource = customer.Widgets;  // unsorted

私は持っている:

bindingSource.DataSource = 
    new LinqEntityBinding<Widget>(db, customer.Widgets, 
    customer.Widgets.OrderBy(w => w.widgetness).ToList()); // sorted
于 2009-09-23T11:23:10.963 に答える