|
||||||||||||||||||||||||||||||||||||||||||
開発環境 | WindowsVista VB2010(VS2010 Pro) Framework 4 / ターゲットCPU:X86 [Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定 |
|||||||||||||||||||||||||||||||||||||||||
その他条件 | 使用データ(dgvdat1.csv)は、次よりダウンロードして使って下さい。 dgvdat309.zip データファイルは、プログラムの起動フォルダーに入れておいてください。 DataGridViewに表示(その1) で、データを表示した状態で実施してください。 下記サンプルコードと同等のイベントで実施してください。 |
|||||||||||||||||||||||||||||||||||||||||
1.DataGridView の新しいレコードの行インデックスを取得 AllowUserToAddRows が false の場合は -1 になります。 AllowUserToAddRows が false ではない限り、このプロパティの値は、コントロールの行数から 1 を引いた値と等しくなります。 Private Sub Button60_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button60.Click Debug.WriteLine(DataGridView1.AllowUserToAddRows.ToString) '結果 True Debug.WriteLine(DataGridView1.NewRowIndex.ToString) '結果 20 Debug.WriteLine(DataGridView1.RowCount.ToString) '結果 21 DataGridView1.AllowUserToAddRows = False Debug.WriteLine(DataGridView1.AllowUserToAddRows.ToString) '結果 False Debug.WriteLine(DataGridView1.NewRowIndex.ToString) '結果 -1 Debug.WriteLine(DataGridView1.RowCount.ToString) '結果 20 End Sub |
||||||||||||||||||||||||||||||||||||||||||
2.DataGridView の新たに追加した行(空行)を調べる(5方法) Private Sub Button61_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button61.Click '新たに追加した行(空行)を調べる(表示方法により違いがあるので注意) 'テスト用に行を追加 'CSVファイルの読み込み表示(1)で表示した場合 'Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable) 'tb.Rows.InsertAt(tb.NewRow, 4) 'CSVファイルの読込表示(非結合)で表示した場合 DataGridView1.Rows.Insert(4, 1) For i As Integer = 0 To DataGridView1.Rows.Count - 1 'これでは上記の追加行は検出できない。 If DataGridView1.Rows(i).IsNewRow Then MessageBox.Show(i + 1 & " 行目は、IsNewRow です。(1)") '22 のみ 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)") '22 のみ 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)") '22 のみ End If Catch ex As Exception End Try Next i End Sub |
||||||||||||||||||||||||||||||||||||||||||
3.DataGridView の行の背景色を1行おきに設定 Private Sub Button62_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button62.Click '1行おきに背景色を設定 Debug.Print(DataGridView1.AlternatingRowsDefaultCellStyle.BackColor.ToString) If DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Empty Then '1行おきに背景色を Yellow に設定 DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Yellow Else '再度クリックで元の色に戻す DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Empty End If End Sub |
||||||||||||||||||||||||||||||||||||||||||
4.DataGridView のユーザーが行のサイズ(高さ)を変更できないように設定 Private Sub Button63_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button63.Click 'すべての行のサイズを変更できる場合は true。それ以外の場合は false。 既定値は、true です。 DataGridView1.AllowUserToResizeRows = (Not DataGridView1.AllowUserToResizeRows) End Sub |
||||||||||||||||||||||||||||||||||||||||||
5.DataGridView の行の高さをセルの内容に合わせて自動調節 Private Sub Button64_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button64.Click 'テスト用に2列目を複数行表示設定に 'WrapMode が True の場合は、改行文字が改行として表示され、 'セル幅を超える行はすべて折り返して表示される。 DataGridView1.Columns(1).DefaultCellStyle.WrapMode = DataGridViewTriState.True DataGridView1.Rows(3).Cells(1).Value = "4行目の" & vbCrLf & "2列目に" & vbCrLf & "書き込み" '行の高さが、ヘッダー セルを除く行内のすべてのセルの内容に合わせて調節されます DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders) End Sub |
||||||||||||||||||||||||||||||||||||||||||
6.DataGridView のクリックした行を確認の上削除 Private Sub DataGridView1_MouseClick(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseClick 'クリックした行を確認の上削除 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 End Sub |
||||||||||||||||||||||||||||||||||||||||||
7.DataGridView の複数選択されている行インデックスを取得・表示 Private Sub Button66_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button66.Click '(2)複数選択されている行インデックスを取得・表示(選択した順番に取得) 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) End If Next '(2)複数選択されている行インデックスを取得・表示(通常の方法) 'こちらは、後入れ先出しになる For Each Row As DataGridViewRow In DataGridView1.SelectedRows Debug.Print(String.Format("RowIndex = {0}", Row.Index)) Next Row '選択されているセル数・行数・列数を取得する '選択されているセル数を取得 Debug.WriteLine(DataGridView1.SelectedCells.Count) '(3)選択されている行数を取得 Debug.WriteLine(DataGridView1.SelectedRows.Count) '選択されている列数を取得 Debug.WriteLine(DataGridView1.SelectedColumns.Count) End Sub |
||||||||||||||||||||||||||||||||||||||||||
8.DataGridView の最下部の新しい行(追加オプション)を非表示にする Private Sub Button67_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button67.Click '最下部の新しい行(追加オプション)を表示しない場合 DataGridView1.AllowUserToAddRows = False '最下部の新しい行(追加オプション)を表示する場合(既定値) DataGridView1.AllowUserToAddRows = True End Sub |
||||||||||||||||||||||||||||||||||||||||||
9.DataGridView のAllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)する Private Sub Button68_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button68.Click '新規行の下には行を追加できないので、事前に追加する。 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 |
||||||||||||||||||||||||||||||||||||||||||
10.DataGridView で指定行を先頭に表示する Private Sub Button69_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button69.Click '指定行(8行目)を DataGridView のTopに表示する DataGridView1.FirstDisplayedScrollingRowIndex = 7 End Sub |
||||||||||||||||||||||||||||||||||||||||||
11.DataGridView で指定行が画面上に表示されているどうかを調査する Private Sub Button70_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button70.Click '指定行が画面上に表示されているどうかを調査する If DataGridView1.Rows(15).Displayed = False Then MessageBox.Show("16行目は表示されていません") End If If DataGridView1.Rows(10).Displayed = True Then MessageBox.Show("11行目は表示されています") End If End Sub |
||||||||||||||||||||||||||||||||||||||||||
12.DataGridView の全ての行の高さを指定の高さに設定 Private Sub Button71_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button71.Click '全ての行の高さを指定の高さに設定 For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Height = 15 Next '又は、 For Each row As DataGridViewRow In DataGridView1.Rows row.Height = 60 Next '表示前なら DataGridView1.RowTemplate.Height = 20 Button2.PerformClick() End Sub |
||||||||||||||||||||||||||||||||||||||||||
13.DataGridView でセルの選択を行単位でする Private Sub Button72_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button72.Click 'セルの選択を行単位でする場合 DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect 'セルの選択をセル単位でする場合 DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect End Sub |
||||||||||||||||||||||||||||||||||||||||||
14.DataGridView の選択位置に行を挿入(4方法) DataGridViewにデータを読み込んで表示した方法により、行の挿入方法が違ってきますので、読み込み表示方法に合せてください。 Private Sub Button73_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button73.Click '選択位置に行を挿入(その1) 表示その1で読み込み表示した場合 Dim tb As DataTable = DirectCast(DataGridView1.DataSource, DataTable) tb.Rows.InsertAt(tb.NewRow, DataGridView1.CurrentCell.RowIndex) '選択位置に行を挿入(その2) 表示その2で読み込み表示した場合 'DataGridView1.Rows.Insert(DataGridView1.CurrentCell.RowIndex, 1) '場合により(その3) 'Dim ds As DataSet = DirectCast(DataGridView1.DataSource, DataSet) 'Dim tb1 As DataTable = ds.Tables(0) 'tb1.Rows.InsertAt(tb1.NewRow, DataGridView1.CurrentCell.RowIndex) '選択位置に行を挿入(その4) 'Private myTB As DataTable 'myTB.Rows.InsertAt(myTB.NewRow, DataGridView1.CurrentCell.RowIndex) End Sub |
||||||||||||||||||||||||||||||||||||||||||
15.DataGridView で複数選択されている行をすべて削除する Private Sub Button74_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button74.Click For Each Row As DataGridViewRow In DataGridView1.SelectedRows If Not Row.IsNewRow Then DataGridView1.Rows.Remove(Row) End If Next Row End Sub |
||||||||||||||||||||||||||||||||||||||||||
16.DataGridView の指定行を非表示に設定する Private Sub Button75_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button75.Click '指定行(Rows(1))を非表示に設定する場合 DataGridView1.Rows(1).Visible = False '指定行(Rows(1))を表示する場合 DataGridView1.Rows(1).Visible = True End Sub |
||||||||||||||||||||||||||||||||||||||||||
17.DataGridView の指定行を選択する Private Sub Button76_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button76.Click '5行目を選択する DataGridView1.Rows(4).Selected = True End Sub |
||||||||||||||||||||||||||||||||||||||||||
18.DataGridView の指定の行を編集不可(読み取り専用)に設定 Private Sub Button77_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button77.Click '5行目(鈴木一郎)を編集不可に設定 DataGridView1.Rows(4).ReadOnly = True '上記編集不可の設定を元に戻す DataGridView1.Rows(4).ReadOnly = False End Sub |
||||||||||||||||||||||||||||||||||||||||||
19.DataGridView の指定の行のみに罫線を描画する Private Sub DataGridView1_CellPainting(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _ Handles DataGridView1.CellPainting '指定の行のみに罫線を描画する(行ヘッダー部分は除く) If e.ColumnIndex >= 0 AndAlso e.RowIndex = 10 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 0, 2, 3, 4, 5 flgStyle = TextFormatFlags.VerticalCenter Or TextFormatFlags.Right Case 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 'DataGridView コントロールのセルの外観をカスタマイズする 'http://msdn.microsoft.com/ja-jp/library/hta8z9sz.aspx End Sub |
||||||||||||||||||||||||||||||||||||||||||
20.DataGridView の |