LoginSignup
1
0

More than 1 year has passed since last update.

DataGridViewの行を削除する処理でエラーが発生し、解決するまでに長時間を要したので記録しました(VB.NET)

Posted at

起きたことや背景

マスタ登録画面上で、削除を押した際に、行を削除する処理を実装中に、以下のようなエラーが発生した。より厳密には、削除ボタンをクリックした際の処理でエラーが発生しました。

Google検索で、これに対する解決法が見つからず(原因がわかったので、その点に集中して調べれば見つかるかも)、ChatGPTへ問い合わせしても解決しなかったため、忘却録としてこの記事に残しました。

削除をクリック
image.png
削除は論理削除を行うことを想定。

デバック時
image.png

エラー文

System.InvalidOperationException: '現在のカレンシー マネージャーの位置に関連付けられた行を非表示にすることはできません。'

実際のコード

        'DataGridView上で、マウスをクリックした際のイベント
    Private Sub dgvStatus_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvStatus.CellMouseClick
        If (e.Button = MouseButtons.Right) Then
            If (e.ColumnIndex >= 0 And e.RowIndex >= 0) Then
                Me.dgvStatus(e.ColumnIndex, e.RowIndex).Selected = True
                Me.ctmClickMenu.Show(System.Windows.Forms.Cursor.Position)
            End If
        End If
    End Sub
    
    'ContextMenuStripをクリックした際のイベント
    Private Sub tsmiDelete_Click(sender As Object, e As EventArgs) Handles tsmiDelete.Click
        If dgvStatus.SelectedCells.Count > 0 Then
            Dim selectedRowIndex As Integer = dgvStatus.SelectedCells(0).RowIndex
            If selectedRowIndex >= 0 AndAlso selectedRowIndex < dgvStatus.Rows.Count Then
                dgvStatus.Rows(selectedRowIndex).Visible = False
            End If
        End If
    End Sub

原因

行を削除(論理削除のため非表示)しようとしていたが、実際にはセルが選択されていたことが原因。

対処法

セルを右クリックで選択した際に、セルではなく行が選択されるようにコードを修正したことで解決しました。

    Private Sub dgvStatus_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgvStatus.CellMouseClick
        If (e.Button = MouseButtons.Right) Then
            If (e.ColumnIndex >= 0 And e.RowIndex >= 0) Then
                '***ここを修正した***
                dgvStatus.Rows(e.RowIndex).Selected = True
                '****************
                Me.ctmClickMenu.Show(System.Windows.Forms.Cursor.Position)
            End If
        End If
    End Sub

    Private Sub tsmiDelete_Click(sender As Object, e As EventArgs) Handles tsmiDelete.Click
        If dgvStatus.SelectedCells.Count > 0 Then
            Dim selectedRowIndex As Integer = dgvStatus.SelectedCells(0).RowIndex
            If selectedRowIndex >= 0 AndAlso selectedRowIndex < dgvStatus.Rows.Count Then
                dgvStatus.Rows(selectedRowIndex).Visible = False
            End If
        End If
    End Sub

注意事項

  • この記事では、SQL Server、SSMS、visual studioを使用しているので、試してみたい方は事前に準備が必要です。

この記事は誰向けの記事か?

  • エラーで困っている人向け

環境

本記事における注意事項

  • 本記事は、備忘録としてまとめたものになります。
  • 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
  • また記載内容はすべて、正しい内容が記載されているとは限りません。
  • 誤った内容を見つけた場合は、ご指摘をお願いいたします。
  • この記事の内容では、一部、ChatGPTを利用しております。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0