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

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

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

**削除をクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/a4b7d340-4914-fb5e-21c6-5b2295644faa.png)
削除は論理削除を行うことを想定。

**デバック時**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/b3418820-1080-ec2c-5918-75dc28484407.png)

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

**実際のコード**
```VB
　　　　　　　　'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
```

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

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

```VB
    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を使用しているので、試してみたい方は事前に準備が必要です。

# この記事は誰向けの記事か？
- エラーで困っている人向け

# 環境
- OS：Windows10
- [SQL Server](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads)
- [SQL Server Management Studio（SSMS）](https://learn.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16):v19.0.2
- [visual studio 2022](https://visualstudio.microsoft.com/ja/vs/)
- [ChatGPT](https://chat.openai.com/chat)

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