データグリッドビューの行を右クリックで削除します。
コンテキストメニューストリップ(ContextMenuStrip)を利用します。
フォームにツールボックスから「コンテキストメニューストリップ(ContextMenuStrip)」を貼り付けます。
削除とキャンセルの2つのツールストリップメニューアイテムを設定します。
コンテキストメニューストリップのイベントでデータグリッドビューのどの行が選択されたか
判定する機能が無いようです?
右クリックしたときにコンテキストメニューストリップのオープニングイベントと
データグリッドビューの行ヘッダークリックイベントを捉えます。
オープニングイベントが先に発生しますのでここでコンテキストメニューストリップの
動作をキャンセルします。
次に行ヘッダークリックイベントが発生しますので、ここでデータグリッドビューの行を判定し、
再度コンテキストメニューストリップを動かします。
ここでフォーム上にコンテキストメニューストリップが表示されます。
(あとは削除、キャンセルの操作を捉えて処理します。)
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
'SQLサーバーのインポート
Imports System.Data.SqlClient
Public Class Form1
'データベース(SQLサーバー)の定義
Private dbCon As New SqlConnection() 'データベースのコネクション
Private dbCmd As New SqlCommand() 'データベースのコマンド
Private dbDr As SqlDataReader 'データベースのデータリーダー
Private dbDAdpt As SqlDataAdapter 'データアダプター
Private dbDSet As DataSet 'データセット
Private dbCmdBuilder As SqlCommandBuilder 'テーブル更新
'削除メニュー制御フラグ(True:表示する,False:表示しない)
Private flagCMS As Boolean
'******************************************************************************
'* フォームのロード(イベント処理)
'******************************************************************************
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'データグリッドビューの列見出し(タイトル名,幅)の定義
Dim aryColHeader() As String = {"ユーザーID", "操作者名", "パスワード", "性別", "作成日"}
Dim aryColLength() As Integer = {160, 180, 160, 60, 100}
'データベース接続(Data Source=サーバー名,Catalog=データベース名)
dbCon.ConnectionString =
"Data Source=PUBLIC\SQLEXPRESS;Initial Catalog=dbExpress;Integrated Security=True"
dbCon.Open()
'ユーザーテーブルの検索(SQL文)の設定
Dim strSQL As String = "SELECT user_id, user_name, pass_word, seibetu, renew_date" _
& " FROM exp_user" _
& " ORDER BY user_id"
'ユーザーテーブルの検索
dbCmd = New SqlCommand(strSQL, dbCon)
dbDAdpt = New SqlDataAdapter(dbCmd)
dbDSet = New DataSet()
dbDAdpt.Fill(dbDSet, "Bind_table")
'データグリッドビューにバインド
DataGridView1.DataSource = dbDSet
DataGridView1.DataMember = "Bind_table"
'データグリッドビューの編集
With DataGridView1
'データバインドした場合、列クリアしてはいけない
'.Columns.Clear()
'データグリッドビューのプロパティ
.BackgroundColor = Color.LightGray '背景色
.RowsDefaultCellStyle.BackColor = Color.Honeydew '行の背景色
.AlternatingRowsDefaultCellStyle.BackColor = Color.Ivory '行の交互背景色
'データグリッドビューの列数の設定(データバインドした場合、列数の指定は不要)
'.ColumnCount = 5
'データグリッドビューの列情報の設定
For i As Integer = 0 To .Columns.Count - 1
.Columns(i).HeaderText = aryColHeader(i) '列ヘッダーのタイトル
.Columns(i).Width = aryColLength(i) '列の幅
'列ヘッダーのタイトルフォント指定
'-----以降の設定は<その1>と同じなので省略---
Next
'データグリッドビューの行ヘッダーに削除メニューの設定
ToolStripMenuItem1.Text = "削 除"
ToolStripMenuItem2.Text = "キャンセル"
For Each row As DataGridViewRow In .Rows
row.HeaderCell.ContextMenuStrip = ContextMenuStrip1
Next
'データグリッドビューの複数行選択をブロック(削除行を特定するため単一行選択)
DataGridView1.MultiSelect = False
'削除メニュー制御フラグの初期化
flagCMS = False
End With
End Sub
'***************************************************************************
'* コンテキストメニューストリップのオープニングイベント
'***************************************************************************
Private Sub ContextMenuStrip1_Opening(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs)
Handles ContextMenuStrip1.Opening
'右クリックで自動表示/SHOW()コマンド表示の制御確認
If flagCMS = False Then
'右クリックで自動表示をキャンセルし、データグリッドビューの行を確認
e.Cancel = True
flagCMS = True
Else
'削除メニューのSHOW()コマンドによる表示(次回操作のためフラグクリア)
flagCMS = False
End If
End Sub
'***************************************************************************
'* データグリッドビュー行ヘッダーのクリックイベント処理
'***************************************************************************
Private Sub DataGridView1_RowHeaderMouseClick(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) _
Handles DataGridView1.RowHeaderMouseClick
'右クリック(ContextMenuStripは右クリックで自動表示をキャンセルし、再表示制御)
If e.Button = MouseButtons.Right Then
'右クリック行を選択に設定
DataGridView1.Rows(e.RowIndex).Cells(0).Selected = True
'削除メニューの再表示(削除はToolStripMenuItem1のクリックによる)
ContextMenuStrip1.Show()
End If
End Sub
'***************************************************************************
'* ツールストリップメニューアイテム1(削除)のクリックイベント
'***************************************************************************
Private Sub ToolStripMenuItem1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
'データグリッドビューから行の削除(右クリックでセレクト状態にした行)
DataGridView1.Rows.Remove(CType(DataGridView1.CurrentRow, DataGridViewRow))
End Sub
'******************************************************************************
'* フォームのクローズ(イベント処理)
'******************************************************************************
Private Sub Form1_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs)
Handles Me.FormClosing
'ユーザーテーブル更新
dbCmdBuilder = New SqlCommandBuilder(dbDAdpt)
dbCmdBuilder.GetUpdateCommand()
dbDAdpt.Update(dbDSet.Tables("Bind_table"))
'データベース解放
dbCmd = Nothing
dbCon.Close()
End Sub
End Class