- - PR -
VB.NET DataGridにてDataSetのレコード削除について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-01-18 14:23
VB.netでWindowsアプリケーション開発中です。
色々調べて、節々似たような事例はあったのですが、 うまく解決することができません。 もし、何か分かることがありましたら、助言頂けないでしょうか。 よろしくお願い致します。 ■やっている事 1.SQLのデータベースのテーブルをDataSet割り当てDataGridに表示 2.DataGrid上のデータを手動で変更等 3.[保存]ボタンでデータベース更新(adp.Update(dt)) ■やりたい事 上の2の時に[行削除]ボタンで現在の行を削除(画面からも削除) その後、3でデータベースに反映させたいのです 一行削除なら問題なく、削除・更新が出来るのですが 一行削除の後、更新する前に別の行を削除する場合がうまくできません。 DataSetのDeleteというのは、DataRowState.Deletedにするだけなので 実際のDataSetには残っていますから、下の方法でDataGridの現在の位置を取得して Deleteしようとすると、別のレコードが削除されてしまいます。 当たり前かもしれませんが、Deleteの後にdt.AcceptChanges()で反映させると DataGrid上はうまく操作されているように見えますが DataSetからも削除されていてUpdateでデータベースへ反映することが できないのです。 どちらもうまくいくようにする方法が思いつきません。 何か方法があれば、よろしくお願い致します。 Dim adp As New SqlClient.SqlDataAdapter Dim ds As New DataSet Dim dt As DataTable Private Sub btn_行削除_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_行削除.Click Dim r As DataRow Dim ret As Integer Dim bm As BindingManagerBase = _ DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) Dim drv As DataRowView = CType(bm.Current, DataRowView) Dim dr As DataRow = drv.Row Dim position As Integer = bm.Position '現在の位置を取得 ret = MessageBox.Show("削除してよろしいですか?", "削除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If ret = DialogResult.Yes Then r = ds.Tables(0).Rows(position) r.Delete() End If End Sub #End Region |
|
投稿日時: 2007-01-18 16:42
色々試行錯誤しまして、何とか、希望の動作を行うものができました。
しかし、レコード数が多くなったら、問題アリだと思われるプログラムだと 自分でも思いますし、ただ、何とか動くという感じです。 (今の所、頻繁に使用するものではないので 大きな問題はないと思うのですがすっきりしません) もし、もっと簡単にできる方法を知っている方がいらっしゃいましたら ご教授お願い致します。 私も、まだ色々考えて、いい方法が見つかりましたら報告致します。 Private Sub btn_行削除_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_行削除.Click Dim r As DataRow Dim ret As Integer Dim bm As BindingManagerBase = _ DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember) Dim drv As DataRowView = CType(bm.Current, DataRowView) Dim dr As DataRow = drv.Row 'Dim position As Integer = bm.Position Dim i As Integer = 0 Dim end_flg As Integer = 0 ret = MessageBox.Show("削除してよろしいですか?", "削除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) If ret = DialogResult.Yes Then While end_flg <> 1 Try If ds.Tables("ZKISHU").Rows(i).RowState <> DataRowState.Deleted Then If ds.Tables("ZKISHU").Rows(i).Item("Num") = drv("Num") Then r = ds.Tables(0).Rows(i) r.Delete() change_flag = 1 Exit While End If End If i += 1 Catch ex As Exception MessageBox.Show(ex.ToString, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Warning) end_flg = 1 End Try End While End If End Sub |
1