2

BindingSourceDataSet、およびTableAdapterを使用してデータ バインド コントロールから挿入を処理する正しい順序はどれですか? これは私に永遠の混乱を引き起こしています。

新しい行を追加するために使用されるフォームがあります。

フォームを表示する前に、次のように呼び出します。

bindingSource.AddNew();
bindingSource.MoveLast();

保存時に、次のように呼び出します。

bindingSource.EndEdit();
tableAdapter.Insert([the row given to me as bindingSource.Current]);

問題はそれです

  • を呼び出さないとEndEdit()、現在フォーカスのある TextBox の変更は保存されません
  • を呼び出すEndEdit()と、BindingSource の Current メンバーは、追加したばかりの行を指しなくなります。

Insert()もちろん、BindingSource によって更新された DataTable とは対照的に、フォームからの値で呼び出すことはできますが、それではデータ バインディングを使用する目的が無効になります。これを機能させるにはどうすればよいですか?

TableAdapter.Update()厳密に型指定された DataSet を使用しているため、DataSet 全体を呼び出すことができることを理解しています。ただし、データベースにバインドされていない外部キーがテーブルにあり、Insert() を呼び出す前に追加しています。

4

2 に答える 2

3

これは、 .NETフレームワークの「機能」であることが判明しました。以前にconnect.microsoft.comで報告されていましたが、問題は「修正されない」としてクローズされました。ただし、回避策があります。

次の C# コードを使用して、ListChanged イベント ハンドラーの位置をリセットしています。

    [...]
        bindingSource.ListChanged += 
            new ListChangedEventHandler(PreserveCurrentPosition);
    [...]


    private void PreserveCurrentPosition(object sender, ListChangedEventArgs e)
    {
        if (e.ListChangedType == System.ComponentModel.ListChangedType.ItemAdded &&
            ((BindingSource)sender).Count - e.NewIndex > 1)
        {
            ((BindingSource)sender).Position = e.NewIndex;
        }
    }
于 2009-03-26T18:38:53.017 に答える
-1

これについてはもうお分かりかと思いますが、テーブル アダプターの挿入メソッドを呼び出す必要はありません。update メソッドを呼び出すだけで、新しいレコードまたは変更されたレコードがあるかどうかが判断され、それに応じて動作します。

于 2010-05-21T15:11:20.977 に答える