none
バインドしたDataGridViewで行削除した後にDBに反映させたい RRS feed

  • 質問

  • お世話になります。

    バインドしたDataGridViewがあり、グリッド上で
    右クリックメニューより「行の追加」と「行の削除」を可能にしております。

    DBへの更新にはバインドをコミット後、adapterのUpdate()を使用しております。

    明細がある画面ではごく一般的な登録方法かと思います。


    行の追加・削除は以下のようにデータテーブルのメソッドを使用しております。

    【行の追加】
    this._MyDataSet.MyDataTable.Rows.InsertAt(newRow, targetIndex);


    【行の削除】
    this._MyDataSet.MyDataTable.RemoveMyDataTableRow(targetRow);


    行の編集後、画面での新規登録は問題なく出来ましたが更新がうまく行きません。

    具体的には「行の削除」です。

    行の削除を行うと画面上から行が消えますが、FillしたDataTableからも行が消えてしまいます。
    よって、そのまま更新を行うと残った行しか更新されません。

    削除行の更新は、データテーブルの状態がDataRowState.Deletedのものが反映されると認識しています。
    ですが、行そのものが消えてしまい通知が出来ないようです。

    ここまでは予想が出来ましたが、これからどうすれば良いのか?どうする方法が一般的なのか分かりません・・・・。



    このように画面上で行削除を行い、それをDBに反映させるといった場合
    どうする方法が一般的なのでしょうか?

    2012年6月7日 0:16

回答

  • DataTableから物理削除されているのでしょう。DataRowのDeleteメソッドではどうでしょうか?

    DataRow.Delete メソッド (System.Data)

    既存の DataRow で Delete メソッドを使用すると、RowState は Deleted になります。 AcceptChanges を呼び出すまで、Deleted の状態を保ちます。 この時点で、DataRow はテーブルから削除されます。


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    • 回答としてマーク sumi_sumi 2012年6月7日 1:07
    2012年6月7日 0:30

すべての返信

  • DataTableから物理削除されているのでしょう。DataRowのDeleteメソッドではどうでしょうか?

    DataRow.Delete メソッド (System.Data)

    既存の DataRow で Delete メソッドを使用すると、RowState は Deleted になります。 AcceptChanges を呼び出すまで、Deleted の状態を保ちます。 この時点で、DataRow はテーブルから削除されます。


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    • 回答としてマーク sumi_sumi 2012年6月7日 1:07
    2012年6月7日 0:30
  • 削除行の更新は、データテーブルの状態がDataRowState.Deletedのものが反映されると認識しています。
    ですが、行そのものが消えてしまい通知が出来ないようです。

    その認識で間違いありません。
    行はどのように削除されていますか? 以下を参考にしてみて下さい。

    方法 : DataTable の行を削除する
    http://msdn.microsoft.com/ja-jp/library/feh3ed13(v=vs.80).aspx

    第6回 データセットを使ったレコードの更新と削除
    http://www.atmarkit.co.jp/fdotnet/basics/adonet06/adonet06_04.html


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年6月7日 0:37
    モデレータ
  • J.Hashimotoさま

    有難う御座います。

    教えていただきましたDleteメソッドで無事解決いたしました。

    本当に有難う御座います(><)

    2012年6月7日 1:08
  • trapemiyaさま

    いつもお世話になっております。

    認識が間違っていなくて安心しました。

    Dleteメソッドで無事に解決にいたりました。

    今後ともどうぞ宜しくお願いいたします。

    いつも本当に有難う御座います。

    2012年6月7日 1:09
  • 解決されたようで良かったですね。
    ところで、RemoveMyDataTableRowは型付データセットで自動生成されたメソッドだと思うのですが、Deleteメソッドを使う行削除のメソッドは自動生成されないようですね。少なくとも私の手元のTableAdapter作成時に自動作成された型付データセットにはありませんでした。もっともその必要性を感じないのでこれで良いのですが・・・
    RemoveMyDataTableRowのようにメソッドが生成されるのは、RemoveメソッドがデータテーブルのRowsプロパティ、つまりDataRowCollectionのメソッドであり、直接データテーブルのメソッドでは無いのが理由なのかもしれません。同様にAddMyDataTableRowというメソッドも生成されているはずで、これも同じ理由ではないかと思います。
    つまり、
    Deleteメソッドは型付DataRowのメソッドだが、Removeメソッド、 AddメソッドはDataRowCollectionのメソッドであるため、型付DataTableのメソッドとして公開したいためにRemoveMyDataTableRowメソッド、AddMyDataTableRowメソッドが自動生成されているのではないかと思いました。

    よって、今回の件については自動生成されたメソッドを使うことはできず、直接Deleteメソッドを実行すれば良いのだと思います。ただ、統一的に扱うのであれば、DeleteMyDataTableRowメソッドが在っても良いと思うのですが、無駄だという考えが優勢になったのでしょうね。どうしても欲しければパーシャルクラスでプログラマーが追加できる道が残されているわけですし。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年6月7日 2:19
    モデレータ