- PR -

VB.NET DataGridにてDataSetのレコード削除について

1
投稿者投稿内容
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 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
Taito
常連さん
会議室デビュー日: 2005/07/21
投稿数: 43
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)