【VB.NET】DataGridViewに右クリックで行編集機能つけた<以外と事例無い>

しばらくぶりのVB.NETですが、STA(Ski Turn Analyzer)開発で、実測データの欠落部分が発生したので、手修正しなければならなくなって、EXCELで手修正するのも面倒なので
DataGridViewで行編集(Insert,Delete,Copy,Paste)さえできればデータ編集できるので、機能追加しました。

STAプログラム巨大なので、datagridview部分に必要なサンプルプログラムだけ公開します。

●概要
  datagridview内でマウスクリックイベントが発生して、そのクリックが右ボタンだったら、ContextMenuSprit1を表示します。
  ContextMenuSprit1は、コントロールオブジェクトなので、ツールボックスでFORM1にドラッグ&ペーストしておきます。
   ContextMenuSpritは、フォームのイニシャライズ時に定義して、指定したSUBへリンクしておきます。
   本プログラムでは、Sub Rinsert() ,Sub Rdelete(),Sub Rcopy() ,Sub Rpasteの4個のSubを作って、ContextMenuSpritのcMenu1にリンクしてます。

●参考にさせていただいた記事
さんざん検索してVB.NET用ではこれしかなかったので貴重な記事です。

コンテキストメニューから[切り取り][コピー][貼り付け]を行うには



●プログラム要点

もともとDataGridViewのプログラムがある方が追加機能として加える場合に使ってください。DataGridViewのプログラムをお持ちでない方は
こちらを参考にして作ってから、本編集機能を追加してください。
   DataGridView学習(Excelとの大きな違いで面食らった話し)
 DataGridViewでMatrixCalculator作った(基本的な使い方が全部はいってますのでDataGridViewの基礎参考例です)

 

GISTからコピーしてください。
https://gist.github.com/dj1711572002/9c18c37a19eb670052f1e65d99c34294

Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
‘———-DGV ContextMenuStrip add——————– Form1の起動時にcMenu1の項目を追加定義
cMenu1 = New ContextMenuStrip()
cMenu1.Items.Add(“Insert”, Nothing, New System.EventHandler(AddressOf Rinsert))
cMenu1.Items.Add(“Delete”, Nothing, New System.EventHandler(AddressOf Rdelete))
cMenu1.Items.Add(“Copy”, Nothing, New System.EventHandler(AddressOf Rcopy))
cMenu1.Items.Add(“Paste”, Nothing, New System.EventHandler(AddressOf Rpaste))’----- 以下FORM1の初期設定項目が続くーーーー

以下は、行Insert、行delete,行copy,行pasteの4つのSubです。

‘Class 全体の変数宣言に配列宣言を追加しておいてください
Public  copyCol()
Public copyRow()’行Insert
Private Sub Rinsert()
Debug.Print(“Rinsert”)
dgv1.Rows.Insert(dgv1.CurrentCell.RowIndex)
For i = 0 To dgv1.Rows.Count – 1
dgv1.Rows(i).HeaderCell.Value = i.ToString()
Next i
End Sub’行delete
Private Sub Rdelete()
Debug.Print(“Rdelete”)
dgv1.Rows.RemoveAt(dgv1.CurrentCell.RowIndex)
For i = 0 To dgv1.Rows.Count – 1
dgv1.Rows(i).HeaderCell.Value = i.ToString()
Next i
End Sub

‘行copy
Private Sub Rcopy()
Debug.Print(“Rcopy”)

Dim cX As Integer = dgv1.CurrentCell.ColumnIndex
Dim cY As Integer = dgv1.RowCount
Dim rX As Integer = dgv1.ColumnCount
Dim rY As Integer = dgv1.CurrentCell.RowIndex
ReDim copyCol(cY)
ReDim copyRow(rX)

For i = 0 To rX – 1
copyRow(i) = CStr(dgv1.Rows(rY).Cells(i).Value)
Next i
For i = 0 To dgv1.Rows.Count – 1
dgv1.Rows(i).HeaderCell.Value = i.ToString()
Next i

End Sub

‘行paste
Private Sub Rpaste()
Debug.Print(“Rpaste”)

‘If RadioButton1.Checked = True Then
Dim cX As Integer = dgv1.CurrentCell.ColumnIndex
Dim cY As Integer = dgv1.RowCount
Dim rX As Integer = dgv1.ColumnCount
Dim rY As Integer = dgv1.CurrentCell.RowIndex
For i = 0 To rX – 1
dgv1.Rows(rY).Cells(i).Value = copyRow(i)
Next i
For i = 0 To dgv1.Rows.Count – 1
dgv1.Rows(i).HeaderCell.Value = i.ToString()
Next i
End Sub

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です