DataGridView Tips集(行に関する設定色々) (309) 玄関へお回り下さい。
 
1. DataGridView の新しいレコードの行インデックスを取得
2. DataGridView の新たに追加した行(空行)を調べる(5方法)
3. DataGridView の行の背景色を1行おきに設定
4. DataGridView のユーザーが行のサイズ(高さ)を変更できないように設定
5. DataGridView の行の高さをセルの内容に合わせて自動調節
6. DataGridView のクリックした行を確認の上削除
7. DataGridView の複数選択されている行インデックスを取得・表示
 (1)選択した順番に取得  (2)選択した逆順(通常)に取得  (3)選択されている行数を取得
8. DataGridView の最下部の新しい行(追加オプション)を非表示にする
 (1)最下部の新しい行(追加オプション)を表示しない  (2)最下部の新しい行(追加オプション)を表示する
9. DataGridView のAllowUserToAddRows = True 時に最下部に新しい行を追加(挿入)する
10. DataGridView で指定行を先頭に表示する
11. DataGridView で指定行が画面上に表示されているどうかを調査する
12. DataGridView の全ての行の高さを指定の高さに設定
13. DataGridView でセルの選択を行単位でする
14. DataGridView の選択位置に行を挿入(4方法)
15. DataGridView で複数選択されている行をすべて削除する
16. DataGridView の指定行を非表示に設定する
17. DataGridView の指定行を選択する
18. DataGridView の指定の行を編集不可(読み取り専用)に設定
19. DataGridView の指定の行のみに罫線を描画する
開発環境 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 NothingThen
         'セルデータの表示位置を列個別に設定
         
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 の


2011/05/20


VBレスキュー(花ちゃん)
Visual Basic6.0  VB6.0
VB.NET2003/VB2005/VB2008/VB2010