DataGridViewをまとめて表示させた時の問題2

解決


PS  2012-08-29 18:00:52  No: 147767  IP: [192.*.*.*]

以前DataGridView でセルが1つ上の行と同じ場合まとめる方法で質問した者です。
たとえば
氏名,区分,所有資格  というデータがあって
1行目  山田太郎,A,技術士
2行目  山田太郎,A,会計士
3行目  田中二郎,A,建築士
4行目  石川五右衛門,B,看護士

のようなデータがあった場合、2列目の「区分」を1行目と2行目はまとめたいのですが、2行目と3行目は氏名が違うのでまとめたくない場合、
どうすればよいでしょうか?
こちらのサイトを参考に単純に現在行と次の行が同じ場合まとめる事はできています。

http://www.atmarkit.co.jp/fdotnet/dotnettips/593dgvgroupedcell/dgvgroupedcell.html

編集 削除
魔界の仮面弁士  2012-08-29 18:59:48  No: 147768  IP: [192.*.*.*]

> 以前DataGridView でセルが1つ上の行と同じ場合まとめる方法で質問した者です。
以前の投稿へのリンクを貼っていただけないでしょうか。


> 2列目の「区分」を1行目と2行目はまとめたいのですが、
> 2行目と3行目は氏名が違うのでまとめたくない場合、
> どうすればよいでしょうか?
現時点で、具体的にどのようなコードを書いているのかは分かりませんが、
少なくとも標準機能には、「まとめる」機能は無いわけですよね。

そこに、前後の行の値を比較することで、同じ値をまとめて表示するよう
コードを付け加えたのでしょうから、その処理を見直して、名前列の値が
異なっているかどうかを判断し、まとめ方を変えてやれば良いかと。

編集 削除
PS  2012-08-30 11:33:43  No: 147769  IP: [192.*.*.*]

以前のリンクです
http://madia.world.coocan.jp/cgi-bin/vbnet/wwwlng.cgi?print+201206/12060015.txt
DataGridview の CellPeinting イベント時に以下のソースを記述
しています。

'現在行の大分類値
Dim C As Object = DataGridView1(0, e.RowIndex).Value
 If e.ColumnIndex = 0 Then
     C = DataGridView1(0, e.RowIndex).Value
 End if
'上の行の大分類値
Dim U As Object = Nothing
 If e.RowIndex > 0 Then
  If e.ColumnIndex = 0 Then
    U = DataGridView1(0, e.RowIndex - 1).Value
  End If
 End If

'下の行の大分類値
Dim B As Object = Nothing
  If e.RowIndex < DataGridView1.Rows.Count - 1 Then
    If e.ColumnIndex = 4 Then
       B = DataGridView1(4, e.RowIndex + 1).Value
    End If
  End If


'現在行=下の行なら、現在行の下枠線を消す
  If Integer.Equals(C, B) Then
    e.AdvancedBorderStyle.Bottom=
        DataGridViewAdvancedCellBorderStyle.None
  End IF
'一番上の行は常に表示する
  If DataGridView1.FirstDisplayedScrollingRowIndex = e.RowIndex Then
    Return
  End If
'現在行=上の行なら、現在行のテキストを消す
 If Integer.Equals(C, U) Then
   Dim selected As Boolean = CBool(e.State And    DataGridViewElementStates.Selected)
   e.PaintBackground(e.CellBounds, selected)
   e.Handled = True
 End If

編集 削除
PS  2012-08-30 11:33:43  No: 147770  IP: [192.*.*.*]

以前のリンクです
http://madia.world.coocan.jp/cgi-bin/vbnet/wwwlng.cgi?print+201206/12060015.txt
DataGridview の CellPeinting イベント時に以下のソースを記述
しています。

'現在行の大分類値
Dim C As Object = DataGridView1(0, e.RowIndex).Value
 If e.ColumnIndex = 0 Then
     C = DataGridView1(0, e.RowIndex).Value
 End if
'上の行の大分類値
Dim U As Object = Nothing
 If e.RowIndex > 0 Then
  If e.ColumnIndex = 0 Then
    U = DataGridView1(0, e.RowIndex - 1).Value
  End If
 End If

'下の行の大分類値
Dim B As Object = Nothing
  If e.RowIndex < DataGridView1.Rows.Count - 1 Then
    If e.ColumnIndex = 4 Then
       B = DataGridView1(4, e.RowIndex + 1).Value
    End If
  End If


'現在行=下の行なら、現在行の下枠線を消す
  If Integer.Equals(C, B) Then
    e.AdvancedBorderStyle.Bottom=
        DataGridViewAdvancedCellBorderStyle.None
  End IF
'一番上の行は常に表示する
  If DataGridView1.FirstDisplayedScrollingRowIndex = e.RowIndex Then
    Return
  End If
'現在行=上の行なら、現在行のテキストを消す
 If Integer.Equals(C, U) Then
   Dim selected As Boolean = CBool(e.State And    DataGridViewElementStates.Selected)
   e.PaintBackground(e.CellBounds, selected)
   e.Handled = True
 End If

編集 削除
PS  2012-08-30 11:51:43  No: 147771  IP: [192.*.*.*]

記載したコードを解析し、一応自己解決しました。
ありがとうございました。

編集 削除