4.DataGridView での行に関する操作関係色々(18_DGV_04) (旧、SampleNo.309) |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :追加なし 参照設定:WaitTime.dll 参照設定方法参照 その他 :使用データは、次よりダウンロードして使って下さい。 dgvdat.zip :このサンプルを使用される前に、左のメニューのDataGridViewでのデータの読込保存関係をご覧になって下さい。 このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.最下部の新しい行を表示/非表示に設定 及び 新しいレコードの行インデックスを取得 |
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '01.最下部の新しい行を表示/非表示に設定 及び 新しいレコードの行インデックスを取得 If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If '新しいレコードの行インデックスを取得 'AllowUserToAddRows が false の場合は -1 になります。 'AllowUserToAddRows が false ではない限り、このプロパティの値は、 'コントロールの行数から 1 を引いた値と等しくなります。 '最下部の新しい行(追加オプション)を表示にする DataGridView1.AllowUserToAddRows = True Debug.WriteLine(DataGridView1.AllowUserToAddRows.ToString) '結果 True Debug.WriteLine(DataGridView1.NewRowIndex.ToString) '結果 10(新しい行は、10行にあります。) Debug.WriteLine(DataGridView1.RowCount.ToString) '結果 11 '最下部の新しい行(追加オプション)を非表示にする DataGridView1.AllowUserToAddRows = False Debug.WriteLine(DataGridView1.AllowUserToAddRows.ToString) '結果 False Debug.WriteLine(DataGridView1.NewRowIndex.ToString) '結果 -1(新しい行は、ありません。) Debug.WriteLine(DataGridView1.RowCount.ToString) '結果 10 End Sub |
2.行の挿入及び新たに追加した行(空行)を調べる方法色々 |
Private frg02 As Boolean Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click '02.新たに追加した行(空行)を調べる方法色々及び行の挿入 frg02 = Not frg02 If frg02 Then Button1.PerformClick() 'CSVファイルの読み込み表示(1)で表示した場合の行の挿入 Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable) tb.Rows.InsertAt(tb.NewRow, 4) Else DGVClear(DataGridView1) '初期化のSub プロシージャを Call DataGridView1.RowTemplate.Height = 60 Button2.PerformClick() 'CSVファイルの読込表示(非結合)で表示した場合の行の挿入 DataGridView1.Rows.Insert(4, 1) End If '新たに追加した行(空行)を調べる(表示方法により違いがあるので注意) For i As Integer = 0 To DataGridView1.Rows.Count - 1 'これでは上記の追加行は検出できない。 If DataGridView1.Rows(i).IsNewRow Then MessageBox.Show(i + 1 & " 行目は、IsNewRow です。(1)") '12 行目のみ End If 'こちらは検出できるが、最下行は、検出できない If IsDBNull(DataGridView1.Item(0, i).Value) Then MessageBox.Show(i + 1 & " 行目は、IsDBNull です。(2)") '5 行目のみ End If 'この表示の場合、最下行しか検出できない Dim testVar As Object = DataGridView1.Item(0, i).Value If IsNothing(testVar) Then MessageBox.Show(i + 1 & " 行目は、Nothing です。(3)") '12 行目のみ End If If IsDBNull(DataGridView1.Item(0, i).Value) Or IsNothing(DataGridView1.Item(0, i).Value) Then MessageBox.Show(i + 1 & " 行目は、DBNull 又は Nothing です。(4)") '両方検出できる End If Try 'この場合追加行は、エラーになるので注意 If Len(DataGridView1.Item(0, i).Value) = 0 Then MessageBox.Show(i + 1 & " 行目は、Len=0 です。(5)") '12 行目のみ End If Catch ex As Exception MessageBox.Show(ex.Message) End Try Next i End Sub |
3.AllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)及び追加書き込み |
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click '03.AllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)及び追加書き込み Button1.PerformClick() '新規行の下には行を追加できないので、事前に追加する。 Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable) tb.Rows.InsertAt(tb.NewRow, DataGridView1.RowCount - 1) DataGridView1.Item(1, DataGridView1.RowCount - 2).Value = "あいうえお" 'これだけでは、行が追加されない。(キーダウンイベントを発生させないと追加できない) '(手動の場合は、書き込んだら自動的に行が追加されるが...。) DataGridView1.Item(1, DataGridView1.RowCount - 1).Value = "かきくけこ" End Sub |
4.DataGridView の行の背景色を1行おきに設定 |
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '04.DataGridView の行の背景色を1行おきに設定 If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If If DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Empty Then '1行おきに背景色を Yellow に設定 DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Yellow Else '再度クリックで元の色に戻す DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Empty End If End Sub 図1.上記実行結果 |
5.DataGridView の行の高さに関する設定色々 |
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '05.DataGridView の行の高さに関する設定色々 DGVClear(DataGridView1) '初期化のSub プロシージャを Call '全ての行の高さを指定の高さに設定(表示前に設定するなら) DataGridView1.RowTemplate.Height = 60 Button2.PerformClick() wt.WaitTime(3000) Beep() '全ての行の高さを指定の高さに設定(表示後に設定するなら) For Each row As DataGridViewRow In DataGridView1.Rows row.Height = 30 Next wt.WaitTime(3000) Beep() '指定行だけなら DataGridView1.Rows(5).Height = 60 wt.WaitTime(3000) Beep() '行の高さが、ヘッダーセルを除く行内のすべてのセルの内容に合わせて調節されます DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders) wt.WaitTime(3000) Beep() '全ての行の高さを行内のすべてのセルの内容に合わせて調節 DataGridView1.AutoResizeRows() wt.WaitTime(3000) Beep() 'ユーザーが行の高さを変更できないように設定(再度クリックすると変更可に) DataGridView1.AllowUserToResizeRows = (Not DataGridView1.AllowUserToResizeRows) End Sub |
6.DataGridView の選択位置に行を挿入する(3方法) |
DataGridViewにデータを読み込んで表示した方法により、行の挿入方法が違ってきますので、読み込み表示方法に合せてください。 Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '06.DataGridView の選択位置に行を挿入する(3方法) If DataGridView1.Rows.Count = 0 Then MessageBox.Show("Button1 or Button2 をクリック後行を選択してから実行して下さい") Exit Sub End If Try '選択位置に行を挿入(その1) (非結合/MDBファイル)の場合は、NG Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable) tb.Rows.InsertAt(tb.NewRow, DataGridView1.CurrentCell.RowIndex) MessageBox.Show("1.の方法で挿入しました") Catch ex As Exception MessageBox.Show(ex.Message) End Try Try '場合により(その2) mdbファイルをADO.NETを使ってDataGridViewに表示の場合等 Dim ds As DataSet = DirectCast(DataGridView1.DataSource, DataSet) Dim tb1 As DataTable = ds.Tables(0) tb1.Rows.InsertAt(tb1.NewRow, DataGridView1.CurrentCell.RowIndex) MessageBox.Show("2.の方法で挿入しました") Catch ex As Exception MessageBox.Show(ex.Message) End Try Try '選択位置に行を挿入(その3) 非連結で読み込み表示の場合等 DataGridView1.Rows.Insert(DataGridView1.CurrentCell.RowIndex, 1) MessageBox.Show("3.の方法で挿入しました") Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub |
7.DataGridView の行の削除色々 |
Private frgRowRemove As Boolean Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click '07.DataGridView の行の削除色々 If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If 'クリックした行の削除を許可 frgRowRemove = True '選択行を削除する場合 Dim rowInd As Integer = DataGridView1.CurrentCell.RowIndex Dim result As DialogResult result = MessageBox.Show(rowInd + 1 & "行目を削除してもよろしいですか?", _ "削除確認", MessageBoxButtons.YesNo) If result = Windows.Forms.DialogResult.Yes Then DataGridView1.Rows.RemoveAt(rowInd) End If wt.WaitTime(2000) '複数選択されている行(1行全体を選択)をすべて削除する場合 For Each Row As DataGridViewRow In DataGridView1.SelectedRows If Not Row.IsNewRow Then DataGridView1.Rows.Remove(Row) End If Next Row End Sub Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseClick If frgRowRemove Then 'クリックした行を確認の上削除 Dim pos As System.Windows.Forms.DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y) If pos.Type = DataGrid.HitTestType.Cell Then Dim result As DialogResult result = MessageBox.Show(pos.RowIndex + 1 & "行目を削除してもよろしいですか?", _ "削除確認", MessageBoxButtons.YesNo) If result = Windows.Forms.DialogResult.Yes Then DataGridView1.Rows.RemoveAt(pos.RowIndex) 'DataGridView1.Rows.Remove(DataGridView1.Rows(pos.RowIndex)) 'こちらでも可 End If End If frgRowRemove = False End If End Sub |
8.指定行を選択する(5行目を選択する) |
Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click '08.指定行を選択する(5行目を選択する) If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If '初期表示時に選択されているセルをなくす(必要な個所で下記コードを実行) DataGridView1.CurrentCell = Nothing '5行目を選択する DataGridView1.Rows(4).Selected = True End Sub |
9.セルの選択を行単位でする/セル単位でする |
Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click '09.セルの選択を行単位でする/セル単位でする If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If If DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect Then 'セルの選択を行単位でする() DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect Else 'セルの選択をセル単位でする DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect End If End Sub |
10.複数選択されている行インデックスを取得・表示 |
Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click '10.複数選択されている行インデックスを取得・表示 If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If '選択されている行数を取得 Dim Sdat As DataGridViewSelectedRowCollection = DataGridView1.SelectedRows '選択されていない場合処理しない If Sdat.Count < 1 Then System.Media.SystemSounds.Beep.Play() Exit Sub End If '先入れ後だしなので、選択した順番に取りだし For i As Integer = Sdat.Count - 1 To 0 Step -1 Dim MyText As String = "" If Me.DataGridView1.Item(0, Sdat(i).Index).Value IsNot Nothing Then MyText = Me.DataGridView1.Item(0, Sdat(i).Index).Value.ToString Debug.Print(Sdat(i).Index.ToString & " MyText : " & MyText) End If Next '複数選択されている行を取得・表示 'こちらは、後入れ先出しになる For Each Row As DataGridViewRow In DataGridView1.SelectedRows Debug.Print(String.Format("RowIndex = {0}", Row.Index)) Next Row End Sub |
11.DataGridView の指定行が画面上に表示されているどうかを調査する |
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click '11.DataGridView の指定行が画面上に表示されているどうかを調査する Button1.PerformClick() For Each row As DataGridViewRow In DataGridView1.Rows row.Height = 100 Next Me.Height = 200 If DataGridView1.Rows(7).Displayed = False Then MessageBox.Show("8行目は表示されていません") End If End Sub |
12.DataGridView の指定行を画面上の Top 位置に表示する |
Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click '12.DataGridView の指定行を画面上の Top 位置に表示する If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If Button1.PerformClick() For Each row As DataGridViewRow In DataGridView1.Rows row.Height = 100 Next Me.Height = 200 '指定行をTopに表示する DataGridView1.FirstDisplayedScrollingRowIndex = 6 '最下行までスクロールさせる場合 'DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView1.Rows.Count - 1 End Sub |
13.DataGridView の指定の行を編集不可(読み取り専用)に設定 |
Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click '13.DataGridView の指定の行を編集不可(読み取り専用)に設定 If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If '5行目(鈴木一郎)を編集不可に設定 'DataGridView1.Rows(4).ReadOnly = True '上記編集不可の設定を元に戻す 'DataGridView1.Rows(4).ReadOnly = False DataGridView1.Rows(4).ReadOnly = Not DataGridView1.Rows(4).ReadOnly End Sub |
14.DataGridView の指定行を非表示に設定する |
Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click '14.DataGridView の指定行を非表示に設定する If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If 'DataGridView1.Rows(1).Visible = False ''元に戻す場合 'DataGridView1.Rows(1).Visible = True DataGridView1.Rows(1).Visible = Not DataGridView1.Rows(1).Visible End Sub |
15.DataGridView の指定の行のみに罫線を描画する |
Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click '15.DataGridView の指定の行のみに罫線を描画する frgRowDrawRectangle = Not frgRowDrawRectangle Button1.PerformClick() End Sub Private frgRowDrawRectangle As Boolean Private Sub DataGridView1_CellPainting(sender As Object, _ e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting '指定の行のみに罫線を描画する(行ヘッダー部分は除く) If frgRowDrawRectangle = True AndAlso e.ColumnIndex >= 0 AndAlso (e.RowIndex = 2 Or e.RowIndex = 5) Then Dim flgStyle As TextFormatFlags '描画する範囲を設定(下側の線が細くなるので描画位置を Height - 1) Dim newRect As New Rectangle(e.CellBounds.X, e.CellBounds.Y, _ e.CellBounds.Width, e.CellBounds.Height - 1) 'セルの内部を塗りつぶしす e.Graphics.FillRectangle(New SolidBrush(e.CellStyle.BackColor), e.CellBounds) 'セルを描画する(線の太さを2ピクセルで) e.Graphics.DrawRectangle(New Pen(New SolidBrush(Color.Red), 2), newRect) If (e.Value IsNot Nothing) Then 'セルデータの表示位置を列個別に設定 Select Case e.ColumnIndex Case 2, 3, 4, 5 flgStyle = TextFormatFlags.VerticalCenter Or TextFormatFlags.Right Case 0, 1 flgStyle = TextFormatFlags.VerticalCenter Or TextFormatFlags.Left End Select TextRenderer.DrawText(e.Graphics, CStr(e.Value), _ e.CellStyle.Font, e.CellBounds, e.CellStyle.ForeColor, flgStyle) End If '処理の完了を通知 e.Handled = True End If End Sub 図2.上記実行結果 |
16.DataGridView の指定の行目までをスクロールされないように設定 |
Private Sub Button18_Click(sender As Object, e As EventArgs) Handles Button18.Click '16.DataGridView の指定の行目までをスクロールされないように設定 If DataGridView1.Rows.Count = 0 Then Button1.PerformClick() End If For Each row As DataGridViewRow In DataGridView1.Rows row.Height = 100 Next '指定の行目までをスクロールされないように設定 DataGridView1.Rows(2).Frozen = True 'これで元に戻りそうに思うのだが、実際には元に戻らない DataGridView1.Rows(2).Frozen = False 'こちらでないと元に戻らない 'DataGridView1.Rows(0).Frozen = False End Sub |
17. |
18. |
検索キーワード及びサンプルコードの別名(機能名) |
新しいレコードの行インデックスを取得 新たに追加した行(空行)を調べる 1行おきに背景色を設定 行のサイズ変更(高さ)を不可に設定 行の高さを自動調整 クリックした行を確認の上削除 選択行を選択順に取得・他 最下部の新しい行を非表示に設定 最下部の新しい行に書き込み追加 指定行を画面のTopに表示する 指定行が画面上に表示されているか 全ての行の高さを指定の高さに設定 セルの選択を行単位でする 選択位置に行を挿入 選択されている行をすべて削除する 指定行(Rows(1))を非表示に設定 指定行(6行目)を選択する 指定の行のみに罫線を描画する 最下行までスクロールさせる 指定の行目までをスクロールされないように設定 |