【VB.NET】DataGridViewの連続した内容のセルの罫線を消す

画面イメージ

セルの値が連続する場合、下の罫線を消し、文字色を白にする

VB
 Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting

     'CustomerIDの列番号
     Dim CoustomerIDCol = DataGridView1.Columns("CustomerID").Index

     '最終行を超える場合、スキップ
     If e.RowIndex + 1 >= G_dtOrder.Rows.Count Then Return

     'CustomerID列以外の場合、スキップ
     If e.ColumnIndex <> CoustomerIDCol Then Return

     '1つ下の値
     Dim NextVal = DataGridView1.Rows(e.RowIndex + 1).Cells(CoustomerIDCol).Value

     '1つ下の値と同じ値の場合、下の罫線を消す
     If NextVal = e.Value Then
         e.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None
         DataGridView1.Rows(e.RowIndex + 1).Cells(CoustomerIDCol).Style.ForeColor = Color.White
     End If

 End Sub

動作確認用コード

VB
 Public G_dtOrder As New DataTable
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

     With G_dtOrder
         .Columns.Add("CustomerID", GetType(String))
         .Columns.Add("ProductName", GetType(String))
         .Columns.Add("Count", GetType(String))
         .Rows.Add("C1", "にんじん", "10")
         .Rows.Add("C1", "きゅうり", "10")
         .Rows.Add("C1", "たまねぎ", "10")
         .Rows.Add("C2", "きゃべつ", "20")
         .Rows.Add("C2", "きゅうり", "30")
         .Rows.Add("C3", "たまねぎ", "40")
     End With

     With DataGridView1
         .DataSource = G_dtOrder
         .AllowUserToAddRows = False
     End With

 End Sub

上の罫線ではなく、下の罫線を消している理由

  • 下記コードを実行すれば分かる通り、デフォルト設定が以下のようになっている
    ヘッダ以外のTopは元々Noneであるため、TopをNoneにしても罫線が消えない
    • 列ヘッダ(Top):6(OutsetDouble)
    • 列ヘッダ(Bottom):5(Outset)
    • ヘッダ以外(Top):1(None)
    • ヘッダ以外(Bottom):2(Single)
VB
 Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting

     If e.ColumnIndex < 0 Then Return
     Debug.WriteLine(e.RowIndex & " " & e.ColumnIndex & " " & e.AdvancedBorderStyle.Top)
     Debug.WriteLine(e.RowIndex & " " & e.ColumnIndex & " " & e.AdvancedBorderStyle.Bottom)

 End Sub

DataGridViewAdvancedCellBorderStyleの列挙体

名称説明
NotSet0未設定
None1境界線なし
Single2一重の境界線
Inset3一重のくぼんだ境界線
InsetDouble4二重のくぼんだ境界線
Outset5一重の盛り上がった境界線
OutsetDouble6二重の盛り上がった境界線
OutsetPartial7盛り上がった部分を含む一重の境界線
DataGridViewAdvancedCellBorderStyleの列挙体

コメント

タイトルとURLをコピーしました