DataGridView Tips集(セルに関する操作関係色々) (309) 玄関へお回り下さい。
 
1. DataGridView のアクティブセル(セルが選択された時)のカラーを変更する
 (1)セルが選択された時の前景色を変更する  (2)セルが選択された時の背景色を変更する
 (3)セルが選択された時の前景色を元に戻す  (4)セルが選択された時の背景色を元に戻す
2. DataGridView の現在アクティブなセル(CurrentCell)を取得及び設定する
 (1)現在アクティブなセルの位置を取得(2方法)  (2)アクティブなセルの値を取得する
 (3)指定のセルをアクティブに設定する  
3. DataGridView のクリックしたセルの位置及び値を取得
 (1)クリックしたセルの位置を取得  (2)クリックしたセルの値を取得する
4. DataGridView の現在アクティブなセル(CurrentCell)に値を設定する
5. DataGridView の現在のセルを編集モードにする
6. DataGridView の指定のセルの値を読み書きする
 (1)指定のセルの値を取得  (2)指定のセルに値を設定
7. DataGridView の指定のセルを選択又はアクティブに設定する
 (1)指定のセルを選択状態にする  (2)指定のセルにカレントセルを移動する(アクティブにする)
8. DataGridView の指定のセルの前景色と背景色を変更する
 (1)指定のセルの前景色を変更する  (2)指定のセルの背景色を変更する
 (3)指定のセルの前景色を元に戻す  (4)指定のセルの背景色を元に戻す
9. DataGridView の初期表示時に選択されているセルをなくす
10. DataGridView の全てのセルを選択する/全てのセルの選択状態を解除する
 (1)全てのセルを選択する  (2)全てのセルの選択状態を解除する
11. DataGridView のセルに書式設定をして表示
 (1)下1桁で0揃え(小数点を表示する場合)  (2)3桁区切りスタイルの場合
 (3)前方に00を付けて表示する場合  (4)文書を付けて表示する場合
12. DataGridView のセルのフォントを設定
 (1)全てのセルに対して設定する場合  (2)セル個別に設定する場合
 (3)特定の列に対して設定する場合  (4)設定値を元に戻す場合
  
13. DataGridView のセルの境界線スタイル/カラーを設定
 (1)グリッド線の色を設定  (2)境界線スタイルを設定
 (3)グリッド線の色とスタイルをデフォルトに設定
14. DataGridView のセルの値が変更された事を取得する
15. DataGridView のセルの値によってセルの色等を変更する
16. DataGridView のセル値が DBNull.Value 又は Nothing の場合に任意の文字を表示する
17. DataGridView の複数選択されているセルを取得・表示
 (1)選択されているセルのインデックスを取得  (2)選択されているセルの個数を取得
18. DataGridView の複数のセル、行、列を同時に選択できるかどうかを設定する
19. DataGridView の指定のセルを編集不可(読み取り専用)に設定
 (1)指定のセルを編集不可(読み取り専用)に設定  (2)セル全体を編集不可に設定
20. DataGridView の指定のセルのみに罫線を描画する
21.
22.
開発環境 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 のアクティブセル(セルが選択された時)のカラーを変更する

Private Sub Button30_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button30.Click
   If DataGridView1.DefaultCellStyle.SelectionForeColor = SystemColors.HighlightText Then
      '(1)セルが選択された時の前景色を変更する
      DataGridView1.DefaultCellStyle.SelectionForeColor = Color.Red
      '(2)セルが選択された時の背景色を変更する
      DataGridView1.DefaultCellStyle.SelectionBackColor = Color.Green
   
Else
      '(3)セルが選択された時の前景色を元に戻す
      DataGridView1.DefaultCellStyle.SelectionForeColor = SystemColors.HighlightText
      '(4)セルが選択された時の背景色を元に戻す
      DataGridView1.DefaultCellStyle.SelectionBackColor = SystemColors.Highlight
   
End If
End Sub

2.現在アクティブなセル(CurrentCell)を取得及び設定する

Private Sub Button31_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button31.Click
'(1)現在アクティブなセルの位置を取得(2方法)  (2)アクティブなセルの値を取得する
   
Dim msg As String = String.Format("Row: {0}, Column: {1},Value: {2}", _
                        DataGridView1.CurrentCell.RowIndex, _
                        DataGridView1.CurrentCell.ColumnIndex, _
                        DataGridView1.CurrentCell.Value.ToString())
   MessageBox.Show(msg)

   '(1)現在アクティブなセルの行インデックスおよび列インデックスを取得
   Debug.WriteLine(DataGridView1.CurrentCellAddress.Y & 
" " & DataGridView1.CurrentCellAddress.X)

'(3)指定のセルをアクティブに設定する
   DataGridView1.CurrentCell = DataGridView1.Item(2, 3)

End Sub

3.DataGridView のクリックしたセルの位置及び値を取得

Private Sub DataGridView1_MouseClick(ByVal sender As Object, _
           
ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseClick
   'クリックしたセルの位置及び値を取得
   
Dim pos As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)
   'Debug.Print(DataGridView1.Item(pos.ColumnIndex, pos.RowIndex).Value.ToString)
   
If pos.Type = DataGrid.HitTestType.Cell Then
      MessageBox.Show(DataGridView1(pos.ColumnIndex, pos.RowIndex).ToString _
                  & 
"   データ: " & CStr(DataGridView1.Item(pos.ColumnIndex, pos.RowIndex).Value))
   
End If
End Sub

4.DataGridView の現在アクティブなセル(CurrentCell)に値を設定する

Private Sub Button33_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button33.Click
'現在アクティブなセル(カレントセル)に値を書き込み
   DataGridView1.CurrentCell.Value = "カレントセルに書き込み"
End Sub

5.DataGridView の現在のセルを編集モードにする

Private Sub Button34_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button34.Click
'現在のセルを編集モードにします。
   DataGridView1.BeginEdit(
True)
End Sub

6.DataGridView の指定のセルの値を読み書きする 

Private Sub Button36_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button36.Click
   '4列目の3行目に書込み(加藤愛子の数学の点数)
   DataGridView1.Item(3, 2).Value = 100
   '4列目の3行目のセルの値を取得(加藤愛子の数学の点数)
   Debug.WriteLine(DataGridView1.Rows(2).Cells(3).Value)   
'結果  100
   '2列目の2行目のセルの値を取得()
   Debug.WriteLine(DataGridView1.Item(1, 1).Value)         
'結果  深田  京子

   '1列目の4行目のセルに書き込み
   DataGridView1.Rows(3).Cells(1).Value = 
"4行目の2列目に書き込み"
   '1列目の4行目のセルの値を取得
   
Dim CelTxt As String = DataGridView1.Rows(3).Cells(1).Value.ToString
   Debug.Print(CelTxt)     
'結果  4行目の2列目に書き込み
End Sub

7.DataGridView の指定のセルを選択又はアクティブに設定する 

Private Sub Button39_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button39.Click
'指定のセルを選択する(2列目の6行目を選択する)
   DataGridView1.Item(1, 5).Selected = 
True

'指定のセルにカレントセルを移動する(2列目の6行目をアクティブにする)
   DataGridView1.CurrentCell = DataGridView1.Item(2, 3)

End Sub

8.DataGridView の指定のセルの前景色と背景色を変更する 

Private Sub Button37_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button37.Click
   If DataGridView1(2, 1).Style.ForeColor = Color.Empty Then
   '3列目の2行目のセルの背景色と前景色を変更する
      DataGridView1(2, 1).Style.ForeColor = Color.Red
      DataGridView1(2, 1).Style.BackColor = Color.Green
   
Else
   '3列目の2行目のセルの背景色と前景色を元に戻す
      DataGridView1(2, 1).Style.ForeColor = Color.Empty
      DataGridView1(2, 1).Style.BackColor = Color.Empty
   
End If
End Sub

9.DataGridView の初期表示時に選択されているセルをなくす

Private Sub Button40_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button40.Click
   '必要な個所で下記コードを実行してください。
   DataGridView1.CurrentCell = 
Nothing
End Sub

10.DataGridView の全てのセルを選択する/全てのセルの選択状態を解除する

Private Sub Button41_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button41.Click
  '全てのセルを選択
   DataGridView1.SelectAll()

   '全ての選択を解除します
   DataGridView1.ClearSelection()
End Sub

11.DataGridView のセルに書式設定をして表示

Private Sub Button42_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button42.Click
   Dim cstyle As New DataGridViewCellStyle
   cstyle.Format = 
"N1"                '下1桁で0揃え N2 :下2桁 (小数点を表示する場合)
   cstyle.Format = 
"#,###"             '3桁区切りスタイルの場合
   cstyle.Format = 
"0000000"           '前方に00を付けて表示する場合    0000123
   cstyle.Format = 
"合計点= ### 点"   '文書を付けて表示する場合 合計点は= 267 点
   DataGridView1.Columns(5).DefaultCellStyle = cstyle
   '書式指定文字は、下記で調べて下さい。
   'http://msdn.microsoft.com/ja-jp/library/dwhawy9k.aspx
End Sub

12.DataGridView のセルのフォントを設定

Private Sub Button43_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button43.Click
  '(1)全てのセルに対して設定する場合
   DataGridView1.DefaultCellStyle.Font = 
New Font("MS ゴシック", 10, FontStyle.Bold)
  '(2)セル個別に設定する場合
   DataGridView1.Item(2, 3).Style.Font = 
New Font("MS UI Gothic", 15, FontStyle.Regular)

  '(3)特定の列に対して設定する場合
   
Dim cstyle As New DataGridViewCellStyle
   cstyle.Font = 
New Font("MS ゴシック", 8, FontStyle.Regular)
   DataGridView1.Columns(5).DefaultCellStyle = cstyle

   '(4)設定値を元に戻す場合
  '下記では、セル個別に変更した分は元に戻りません

   DataGridView1.DefaultCellStyle = 
Nothing

   '個別に元に戻す必要がある
   DataGridView1.Item(2, 3).Style = 
Nothing
End Sub

13.DataGridView のDataGridView のセルの境界線スタイル/カラーを設定

Private Sub Button44_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button44.Click
   '(1)セルを区切るグリッド線の色を設定
   DataGridView1.GridColor = Color.Blue
   '(2)セル境界線スタイルを一重線の境界線に設定
   DataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.Single
   'セルの上側の境界線スタイルを二重線のくぼんだ境界線に設定
   DataGridView1.AdvancedCellBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.InsetDouble 
   'セルの左側の境界線スタイルを二重線の浮き出した境界線に設定
   DataGridView1.AdvancedCellBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.OutsetDouble

   '(3)グリッド線の色とスタイルをデフォルトに設定
   DataGridView1.GridColor = SystemColors.ControlDarkDark
   DataGridView1.AdvancedCellBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None
   DataGridView1.AdvancedCellBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None
End Sub

14.セルの値が変更された事を取得する

Private CellValChang As Boolean
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _
               
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
                                             
Handles DataGridView1.CellValueChanged
'セルの値が変更された場合にこのイベントが発生する。
'表示1のようにバインドされている場合の読み込み時は発生しないが、非結合の場合は発生する
'又、行の挿入・削除のような場合も発生しない。確認してから使用の事
'(別途、削除や挿入した場合は、このフラグを True にする等で対応する)
'データの読込後に、False に設定し、保存前等に値を確認する
   CellValChang = 
True  'イベントが発生したらフラグを設定する
End Sub

15.DataGridView のセルの値によってセルの色等を変更する

下記は、テストの合計点によってセルの色分けをしている、コード自体は特に目新しいものではないが、CellFormatting イベント内で処理する事によって簡単に設定できる

Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _
               
ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs _
                                    ) 
Handles DataGridView1.CellFormatting
'セルの値によってセルの色等を変更する
   
Dim dgv As DataGridView = CType(sender, DataGridView)
   
If dgv(5, e.RowIndex).Value IsNot Nothing Then
     
If CInt(dgv(5, e.RowIndex).Value) < 180 Then
         dgv(5, e.RowIndex).Style.BackColor = Color.Red
     
ElseIf CInt(dgv(5, e.RowIndex).Value) < 210 Then
         dgv(5, e.RowIndex).Style.BackColor = Color.Yellow
     
Else
         e.CellStyle.BackColor = Color.White
     
End If
   
End If
End Sub

16.DataGridView のセル値が DBNull.Value 又は Nothing の場合に任意の文字を表示する

Private Sub Button48_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button48.Click
'セル値が DBNull.Value または Nothing である場合に DataGridView のセルに表示する値を取得または設定
'(実際にセルに書き込まれるのではありません、従って保存もできません書き込むには編集する必要があります、詳しくは、MSDN を)


   DataGridView1.DefaultCellStyle.NullValue = 
"?"
 
'DataGridView1.DefaultCellStyle.NullValue = "空のセルです"

  '元の(デフォルト)状態に戻す場合
   DataGridView1.DefaultCellStyle.NullValue = 
String.Empty
End Sub


17.DataGridView の複数選択されているセルを取得・表示

Private Sub Button49_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button49.Click
'(1)複数選択されているセルを取得・表示
   
For Each Cel As DataGridViewCell In DataGridView1.SelectedCells
      Debug.Print(
String.Format("ColumnIndex = {0} RowIndex = {1}", Cel.ColumnIndex, Cel.RowIndex))
   
Next Cel

   '(2)選択されているセル数を取得
   Debug.WriteLine(DataGridView1.SelectedCells.Count)
   '選択されている行数を取得
   Debug.WriteLine(DataGridView1.SelectedRows.Count)
   '選択されている列数を取得
   Debug.WriteLine(DataGridView1.SelectedColumns.Count)

End Sub

18.DataGridView の複数のセル、行、列を同時に選択できるかどうかを設定する

Private Sub Button50_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button50.Click
'複数セル(行・列)の選択を禁止する場合
  DataGridView1.MultiSelect = False

'複数セル(行・列)の選択を可能にする場合
   DataGridView1.MultiSelect = 
True

End Sub

19.DataGridView の指定のセルを編集不可(読み取り専用)に設定

Private Sub Button51_Click(ByVal sender As System.Object, _
                           
ByVal e As System.EventArgs) Handles Button51.Click
   '(1)7行目の4列目(原田  智子の数学の点数)を編集不可に設定
   DataGridView1.Item(3, 6).ReadOnly = 
True
   '(2)セル全体を編集不可に設定する場合
  DataGridView1.ReadOnly = True

   '上記編集不可の設定を元に戻す
   DataGridView1.Item(3, 6).ReadOnly = False
  DataGridView1.ReadOnly = False

End Sub

20.DataGridView の指定のセルのみに罫線を描画する

Private Sub DataGridView1_CellPainting(ByVal sender As Object, _
         
ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
                                               
Handles DataGridView1.CellPainting
   If e.RowIndex = 5 And e.ColumnIndex = 1 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.HotPink), 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



2011/05/20


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