DataGridでグループ化して表示 WPF

VB Tips And Sample(HOME)VBプログラマの為のWPF入門

DataGridでグループ化して表示 WPF

今回も前回の続きで、データグリッド。
グループ化して表示してみるというサンプル。
MSのサイトに掲載されているものを参考。
MSのサイトでは、タイトルにバインドしたデータを表示できているようだが、
管理人のサンプルではできなかった?

System.Windows.Data Error: 40 : BindingExpression path error: '県' property not found on 'object' ''CollectionViewGroupInternal'
と言うエラーがでる。が、実行可能だ。
何が悪いのやら?
WPFで困るのは、先行サンプルが複数無いので、ハマルとなかなか解決できなくて、時間だけが経つといったところか。

翌朝、<Label Content="{Binding }"/>とやってみるとすんなりとできたのだが、なんで?

ちなみに、この処理だが、都道府県を全て持ってくると、重くて、とてもじゃないが、使えない。
と言うわけで、TOP10等としてみたが、件数が多い場合には要注意の処理みたいだ。

データグリッドグループ化 データグリッドグループ化

Imports System.Data
Imports System.Data.SqlClient
Imports System.Collections.ObjectModel 'これをインポートする必要がある!


Public Class Window5
    Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
        'SQLサーバからKEN_ALLを検索取得

        Dim DA As New SqlDataAdapter
        Dim cnn As New SqlConnection
        Dim cmnd As New SqlCommand
        Dim ds As DataSet = New DataSet


        Try
            'すべてのテーブル内のすべての行を削除して、データの DataSet を消去します。
            ds.Clear()

            'コネクションストリングを設定
            cnn.ConnectionString = "user id=vbuser;password=sa;initial catalog=MYTEST;data source=(local);Connect Timeout=5"
            'cnn.ConnectionString = "user id=vbuser;password=sa;initial catalog=MYTEST;data source=PC名\SQLEXPRESS;Connect Timeout=5"
            'この接続は明示的にオープンクローズする必要がない。Fillでオープンクローズを勝手にしてくれる

            Dim i As New System.Diagnostics.Stopwatch()

            i.Start()

            'SQL文を設定し、コマンドにコネクションを設定する
            Dim MySQL As String
            'わざと並びを変えて
            MySQL = "SELECT top 10 県,郵便番号,市区町村,町域 FROM KEN_ALL WHERE 県 in('北海道')"
            MySQL += "UNION SELECT top 10 県,郵便番号,市区町村,町域 FROM KEN_ALL WHERE 県 in('青森県')  ORDER BY 県"
            cmnd.CommandText = MySQL
            cmnd.Connection = cnn

            'データアダプターにコマンドを設定
            DA.SelectCommand = cmnd

            'レコード数の取得
            Dim reCount As Integer

            'データセットにデータの実態を取得する()
            reCount = DA.Fill(ds, "KEN_ALL")

            'MessageBox.Show(reCount)

            Dim tbv As New DataView
            tbv.Table = ds.Tables("KEN_ALL")

            Dim ColV As CollectionView = New BindingListCollectionView(tbv)

            Debug.Print(ColV.CanGroup)

            ColV.GroupDescriptions.Add((New PropertyGroupDescription("県")))

            Me.DataGrid1.ItemsSource = ColV


            i.Stop()
            Debug.Print(i.ElapsedMilliseconds.ToString)


        Catch ex As Exception
            MessageBox.Show(ex.Message, "SQL検索", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
End Class


<Window x:Class="Window5"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window5" Height="300" Width="300">
    <Grid>
        <Grid.Resources>

            
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Button Content="Button" Grid.Row="0" Height="41"  Name="Button1"  Width="154" />
  
        <DataGrid Grid.Row="1" Name="DataGrid1" >
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Margin" Value="0,0,0,5"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander Background="Aqua" BorderBrush="#FF002255" Foreground="Chocolate" BorderThickness="1,1,1,5">
                                            <Expander.Header>
                                                <DockPanel>
                                                    <!--<Label Content="{Binding 県}"/>--><!--うまくバインドされない!?何をすれば?-->
                                                    <TextBlock FontWeight="Bold" Text="県" Margin="5,0,0,0" Width="100"/>
                                                </DockPanel>
                                            </Expander.Header>
                                            <Expander.Content>
                                                <ItemsPresenter />
                                            </Expander.Content>
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle>
        </DataGrid>
    </Grid>
</Window>

下記に書き直したらうまくいったが、なんで?

<Window x:Class="Window5"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window5" Height="300" Width="300">
    <Grid>
        <Grid.Resources>

            
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Button Content="Button" Grid.Row="0" Height="41"  Name="Button1"  Width="154" />

        <DataGrid Grid.Row="1" Name="DataGrid1">
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Margin" Value="0,0,0,5"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander Background="Aqua" BorderBrush="#FF002255" Foreground="Chocolate" BorderThickness="1,1,1,5">
                                            <Expander.Header>
                                                <DockPanel>
                                                    
                                                    <Label Content="{Binding }"/><!--これだとバインされる-->
                          参考url >
                                                </DockPanel>
                                            </Expander.Header>
                                            <Expander.Content>
                                                <ItemsPresenter />
                                            </Expander.Content>
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle>
            <DataGrid.Columns>
                <!--<DataGridTextColumn Header="県" Binding="{Binding 県}" ></DataGridTextColumn>-->
                <DataGridTextColumn Header="郵便番号" Binding="{Binding 郵便番号}" ></DataGridTextColumn>
                <DataGridTextColumn Header="市区町村" Binding="{Binding 市区町村}" ></DataGridTextColumn>
                <DataGridTextColumn Header="町域" Binding="{Binding 町域}" ></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

VB Tips And Sample(HOME)VBプログラマの為のWPF入門