1

私のdatagridViewでデータの変更を処理することにほとんど問題はありません。次のように、DataSource を datagridview にバインドします。

     private void Form1_Load(object sender, EventArgs e)
    {
        var customersQuery = new ObservableCollection<Payment>(context.Payments);
        customersQuery.CollectionChanged += new NotifyCollectionChangedEventHandler(customerQuery_Changed);
        dataGridView1.DataSource = new BindingSource() { DataSource = customersQuery };

    }
    OrdersDataModelContainer context = new OrdersDataModelContainer();

そして、私は以下のような変更を処理しています:

    private void customerQuery_Changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (Payment p in e.NewItems)
            {
                context.Payments.Add(p);
            }
        }
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach (Payment p in e.OldItems)
            {

                context.Payments.Remove(p);
            }
        }
        context.SaveChanges();
    }

削除は機能しますが、追加はあまりうまくいきません。新しい行をクリックすると、追加アクションが呼び出されます。セルが空であるため、例外が発生します。挿入が終わって次の行に切り替えた後、 Add を呼び出すように動作を簡単に変更するにはどうすればよいですか? もう 1 つの問題は、既存のデータ行の変更です。それらは、新しいデータを挿入した後にのみデータベースで更新されます。

誰かが私に解決策やそれを探すべきポイントを教えてもらえますか?

4

2 に答える 2

1

CollectionChanged で、新しい空の要素を挿入します。PropertyChanged で要素に値を挿入します。

于 2013-10-11T13:08:12.530 に答える
1

次のクラスを使用できます。

public class MyCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{
    public event CollectionChangeEventHandler RealCollectionChanged;

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        base.OnCollectionChanged(e);
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add && e.NewItems.Count > 0)
        {
            this.OnRealCollectionChanged(e.NewItems[0]);
        }
    }

    protected virtual void OnRealCollectionChanged(object element)
    {
        if (this.RealCollectionChanged != null)
        {
            this.RealCollectionChanged(this, new CollectionChangeEventArgs(CollectionChangeAction.Add, element));
        }
    }
}

このイベントは標準のイベントの後にスローされますが、これがスローできる最新のポイントです。

于 2013-10-11T13:06:22.823 に答える