tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル反復処理
記事No982
投稿日: 2004/07/15(Thu) 10:20
投稿者なつみ
[OSのVer]:Windows    [VBのVer]:VB.NET  

DataGridで質問があります。

DataGridに表示されている1番目の項目と2番目の項目が一致(重複)する場合
一つにまとめることは出来るのでしょうか?

Excelで例えるなら、結合のような処理です。
セルのA1とA2を結合して一つにする

1番目の項目と、2番目の項目が一致するのなら2番目の項目を空白にする
という処理はあまりしくありません。
(最悪の場合これになるかと思うのですが・・・。)

ここにやりたいことが書いてあるのですが、
ASP.NetのサンプルなのでVB.Netでも使えるのでしょうか?
hhttp://www.atmarkit.co.jp/fdotnet/dotnettips/084sumdg/sumdg.html

いい方法がありましたらご教授ください。
お願いします。

[ツリー表示へ]
タイトルRe: 反復処理
記事No985
投稿日: 2004/07/15(Thu) 19:31
投稿者るしぇ
リンク先のサンプルは合計という計算値の表示で
>Excelで例えるなら、結合のような処理です。
との共通点が見出せないんですが?(汗)

DataGrid のフッターの存在は聞いたことないですが、
レコードを1つ追加してやれば同様の表示はできますが?

>1番目の項目と、2番目の項目が一致するのなら
説明として分かりにくいので『行』とか『列』と
いう表現で正しく伝わるように説明して下さい。

[ツリー表示へ]
タイトルRe^2: 反復処理
記事No986
投稿日: 2004/07/16(Fri) 09:15
投稿者なつみ
[OSのVer]:Windows    [VBのVer]:VB.NET  

すいません。リンク先が違っていました
hhttp://www.atmarkit.co.jp/fdotnet/dotnettips/092joincells/joincells.html
↑ここがそうです

リンク先が違っていたので、うまく伝わっていないと思うのですが

1番目の列の項目と2番目の列の項目が同じの場合セルを結合して
表示を一つにしたいと考えています。

でも、DataGridの仕様では結合は出来ないですよね・・・?

何か列に連続してる項目を見やすく表示する方法はありませんでしょうか?
何か方法がありましたら教えてください。
お願いします

[ツリー表示へ]
タイトルRe^3: 反復処理
記事No991
投稿日: 2004/07/16(Fri) 15:06
投稿者緋色
DataGridTableStyle を使用し、DataGridTextBoxColumn を
下記のクラスに変更してみてください。

セル間の移動や、結合解除などは考慮していません。


Public Class MyDataGridTextBoxColumn
    Inherits System.Windows.Forms.DataGridTextBoxColumn

    Protected Overloads Overrides Sub Edit( _
       ByVal source As CurrencyManager, _
       ByVal rowNum As Integer, _
       ByVal bounds As Rectangle, _
       ByVal read As Boolean, _
       ByVal instantText As String, _
       ByVal cellIsVisible As Boolean _
    )
        ComputeBounds(source, rowNum, bounds)
        MyBase.Edit(source, rowNum, bounds, read, instantText, cellIsVisible)
    End Sub

    Protected Overrides Function Commit( _
       ByVal dataSource As CurrencyManager, _
       ByVal rowNum As Integer _
    ) As Boolean
        Dim drv As DataRowView
        Dim map1 As String
        Dim map2 As String
        Dim obj1 As Object
        Dim obj2 As Object
        Dim result As Boolean

        drv = CType(dataSource.List, DataView)(rowNum)
        map1 = DataGridTableStyle.GridColumnStyles(0).MappingName
        map2 = DataGridTableStyle.GridColumnStyles(1).MappingName
        obj1 = drv(map1)
        obj2 = drv(map2)

        result = MyBase.Commit(dataSource, rowNum)

        If result And Not drv.IsNew And obj1.Equals(obj2) Then
            Select Case DataGridTableStyle.GridColumnStyles.IndexOf(Me)
                Case 0
                    drv(map2) = drv(map1)
                Case 1
                    drv(map1) = drv(map2)
            End Select
        End If

        Return result
    End Function

    Protected Overloads Overrides Sub Paint( _
        ByVal g As Graphics, _
        ByVal bounds As Rectangle, _
        ByVal source As CurrencyManager, _
        ByVal rowNum As Integer, _
        ByVal backBrush As Brush, _
        ByVal foreBrush As Brush, _
        ByVal alignToRight As Boolean _
    )
        ComputeBounds(source, rowNum, bounds)
        MyBase.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight)
    End Sub

    Private Sub ComputeBounds( _
        ByVal source As CurrencyManager, _
        ByVal rowNum As Integer, _
        ByRef bounds As Rectangle _
    )
        Dim dataGrid As DataGrid
        Dim drv As DataRowView
        Dim map1 As String
        Dim map2 As String
        Dim obj1 As Object
        Dim obj2 As Object

        dataGrid = DataGridTableStyle.DataGrid
        drv = CType(source.List, DataView)(rowNum)
        map1 = DataGridTableStyle.GridColumnStyles(0).MappingName
        map2 = DataGridTableStyle.GridColumnStyles(1).MappingName
        obj1 = drv(map1)
        obj2 = drv(map2)

        Select Case DataGridTableStyle.GridColumnStyles.IndexOf(Me)
            Case 0 To 1
                If Not drv.IsNew And obj1.Equals(obj2) Then
                    bounds.X = dataGrid.GetCellBounds(rowNum, 0).Left
                    bounds.Width = dataGrid.GetCellBounds(rowNum, 1).Right - _
                        dataGrid.GetCellBounds(rowNum, 0).Left
                End If
        End Select
    End Sub

End Class

[ツリー表示へ]