tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB.net Datagrid タイトルが複数行にわたる表の作成
記事No7850
投稿日: 2008/07/23(Wed) 20:29
投稿者やま
VS2005のVB.netでwindowsアプリケーションの開発をしています。

DataGridコントロールの表で、1行目がColA,ColB,ColC、2行目がColD,ColEといった形で
表を作成したいのですが、方法がよくわかりません。
いろいろと調べてはみたのですが・・・
申し訳ありませんが、詳しい方がいらっしゃいましたら教えてください。

[ツリー表示へ]
タイトルRe: VB.net Datagrid タイトルが複数行にわたる表の作成
記事No7851
投稿日: 2008/07/23(Wed) 21:47
投稿者魔界の仮面弁士
> VS2005のVB.netでwindowsアプリケーションの開発をしています。
> DataGridコントロールの表で、

DataGridView ではなく、
DataGrid を使っておられるのですね?


> 1行目がColA,ColB,ColC、2行目がColD,ColEといった形で
> 表を作成したいのですが、方法がよくわかりません。

「1 行目が 3 列(ColA,ColB,ColC)」あるのに、その下に来る
「2 行目が 2 列(ColD,ColE)」しか無いという事は、もしかして
セルのマージを行いたいという事でしょうか?
┏━┳━┳━┓ だとしたら、残念ながら DataGrid コントロールには
┃A┃B┃C┃ マージはおろか、複数行ヘッダ機能すら用意されていないので
┣━┻┳┻━┫ そうした機能を持ったライブラリを探して購入するか、あるいは
┃ D ┃ E ┃ 類似機能を自作するなどの対応が求められるかと思います。 
┗━━┻━━┛ http://www.geocities.jp/mnow/cs_usercontrol12.html


これが DataGridView であれば、CellPainting イベント等を使って複数行ヘッダを
擬似的に実装する事もできますが…継承していない素の DataGrid の場合は、
あまり高度な表現はできないかと思います。

Imports System.Reflection
Public Class Form1
    Private dg As New DataGrid()
    Private tbl As New DataTable()
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        tbl.Columns.Add("ColA/ColD")
        tbl.Columns.Add("ColB/ColE")
        tbl.Columns.Add("ColC")
        tbl.Rows.Add("A1", "B1", "C1") : tbl.Rows.Add("D1", "E1", "") : tbl.Rows.Add("", "", "")
        tbl.Rows.Add("A2", "B2", "C2") : tbl.Rows.Add("D2", "E2", "") : tbl.Rows.Add("", "", "")
        tbl.Rows.Add("A3", "B3", "C3") : tbl.Rows.Add("D3", "E3", "")
        Controls.Add(dg)
        dg.Dock = DockStyle.Fill
        dg.SetDataBinding(tbl, "")
        SetRowHeight(dg, 2, 2)
        SetRowHeight(dg, 5, 2)
    End Sub

    Public Sub SetRowHeight(ByVal dg As DataGrid, ByVal Row As Integer, ByVal height As Integer)
        Dim p As PropertyInfo = dg.GetType().GetProperty("DataGridRows", BindingFlags.FlattenHierarchy Or BindingFlags.IgnoreCase Or BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static)
        Dim r As Object() = p.GetValue(dg, BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.GetProperty Or BindingFlags.Public Or BindingFlags.SuppressChangeType, Nothing, Nothing, Nothing)
        If Row < r.Length Then
            r(Row).Height = height
            dg.Invalidate()
        Else
            Throw New InvalidOperationException()
        End If
    End Sub
End Class

[ツリー表示へ]
タイトルRe^2: VB.net Datagrid タイトルが複数行にわたる表の作成
記事No7871
投稿日: 2008/07/28(Mon) 21:10
投稿者やま
お礼が大変遅くなり、申し訳ございませんでした。
魔界の仮面弁士様、大変勉強になりました。
ありがとうございました。


> > VS2005のVB.netでwindowsアプリケーションの開発をしています。
> > DataGridコントロールの表で、
>
> DataGridView ではなく、
> DataGrid を使っておられるのですね?
>
>
> > 1行目がColA,ColB,ColC、2行目がColD,ColEといった形で
> > 表を作成したいのですが、方法がよくわかりません。
>
> 「1 行目が 3 列(ColA,ColB,ColC)」あるのに、その下に来る
> 「2 行目が 2 列(ColD,ColE)」しか無いという事は、もしかして
> セルのマージを行いたいという事でしょうか?
> ┏━┳━┳━┓ だとしたら、残念ながら DataGrid コントロールには
> ┃A┃B┃C┃ マージはおろか、複数行ヘッダ機能すら用意されていないので
> ┣━┻┳┻━┫ そうした機能を持ったライブラリを探して購入するか、あるいは
> ┃ D ┃ E ┃ 類似機能を自作するなどの対応が求められるかと思います。 
> ┗━━┻━━┛ http://www.geocities.jp/mnow/cs_usercontrol12.html
>
>
> これが DataGridView であれば、CellPainting イベント等を使って複数行ヘッダを
> 擬似的に実装する事もできますが…継承していない素の DataGrid の場合は、
> あまり高度な表現はできないかと思います。
>
> Imports System.Reflection
> Public Class Form1
>     Private dg As New DataGrid()
>     Private tbl As New DataTable()
>     Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
>         tbl.Columns.Add("ColA/ColD")
>         tbl.Columns.Add("ColB/ColE")
>         tbl.Columns.Add("ColC")
>         tbl.Rows.Add("A1", "B1", "C1") : tbl.Rows.Add("D1", "E1", "") : tbl.Rows.Add("", "", "")
>         tbl.Rows.Add("A2", "B2", "C2") : tbl.Rows.Add("D2", "E2", "") : tbl.Rows.Add("", "", "")
>         tbl.Rows.Add("A3", "B3", "C3") : tbl.Rows.Add("D3", "E3", "")
>         Controls.Add(dg)
>         dg.Dock = DockStyle.Fill
>         dg.SetDataBinding(tbl, "")
>         SetRowHeight(dg, 2, 2)
>         SetRowHeight(dg, 5, 2)
>     End Sub
>
>     Public Sub SetRowHeight(ByVal dg As DataGrid, ByVal Row As Integer, ByVal height As Integer)
>         Dim p As PropertyInfo = dg.GetType().GetProperty("DataGridRows", BindingFlags.FlattenHierarchy Or BindingFlags.IgnoreCase Or BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static)
>         Dim r As Object() = p.GetValue(dg, BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.GetProperty Or BindingFlags.Public Or BindingFlags.SuppressChangeType, Nothing, Nothing, Nothing)
>         If Row < r.Length Then
>             r(Row).Height = height
>             dg.Invalidate()
>         Else
>             Throw New InvalidOperationException()
>         End If
>     End Sub
> End Class

[ツリー表示へ]