ListViewを使用する WPF

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

ListViewを使用する WPF

データグリッドとよく似た物に、リストビューがある。
違う所は、と思ってみると、そんなに違うことが無いのかも?
Windows版では、アイコンモードなど多岐にわたってプロパティーで変更できた気がしますが、
WPF版は、ゴリゴリと手で書かなければだめらしい。
となれば、DataGridぽくもできてしまう。
どちらを使うか悩みが増えるかも?
とりあえず、データを表示してみる。
基本は、
<ListView>
  <ListView.View>
    <GridView>
      <GridViewColumn DisplayMemberBinding="{Binding 県}" Header="県"/>
の構造。
Button1_Clickの方は、XAMLにデータバインドを書いて、Me.ListView1.ItemsSourceに、DataViewを入れておくだけ。
個人的にはこちらの方が好み。

Button2_Clicknのほうは、VBでバインド等を行う方法。
これだと、SQLの変更が、表示順に影響するのでちょっと心もとないですね。

リストビュー
<Window x:Class="WindowListView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WindowListView" Height="300" Width="840">
    <Grid>
        <ListView Height="199" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ListView1" VerticalAlignment="Top" Width="378" ItemsSource="{Binding}">
            <ListView.View>
                <GridView>
                    <GridViewColumn  DisplayMemberBinding="{Binding 県}" Header="県"/>
                    <GridViewColumn  DisplayMemberBinding="{Binding 郵便番号}" Header="郵便番号"/>
                    <GridViewColumn  DisplayMemberBinding="{Binding 市区町村}" Header="市区町村"/>
                    <GridViewColumn  DisplayMemberBinding="{Binding 町域}" Header="町域"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Content="SQLserver" Height="24" HorizontalAlignment="Left" Margin="12,0,0,12" Name="Button1" VerticalAlignment="Bottom" Width="91" />
        <Button Content="手動" Height="26" HorizontalAlignment="Left" Margin="412,223,0,0" Name="Button2" VerticalAlignment="Top" Width="99" />
        <ListView Height="200" HorizontalAlignment="Left" Margin="398,16,0,0" Name="ListView2" VerticalAlignment="Top" Width="408" />
    </Grid>
</Window>

			

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


Public Class WindowListView


    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 県,cast([郵便番号] as decimal) AS 郵便番号,市区町村,町域 FROM KEN_ALL WHERE 県 in('北海道')"
            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")


            Me.ListView1.ItemsSource = tbv


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


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

    Private Sub Button2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button2.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('北海道')"
            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 gv As GridView = New GridView
            Dim gvc1 As New GridViewColumn
            Dim gvc2 As New GridViewColumn

            gvc1.Header = "郵便番号"
            gvc1.DisplayMemberBinding = New Binding(String.Format("[0]"))
            gv.Columns.Add(gvc1)
            ListView2.View = gv

            gvc2.Header = "市区町村"
            gvc2.DisplayMemberBinding = New Binding(String.Format("[1]"))
            gv.Columns.Add(gvc2)
            ListView2.View = gv

            Me.ListView2.ItemsSource = tbv


            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



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