VB のたまご

作成日: 2017/03/05, 更新日: 2017/03/05



ListBox

    イメージ
  •  ListBox は、複数の選択肢の中から1つ、または複数選択するための機能を提供するコントロールです。 とりあえずどういう風に動くのか見てみましょう。 以下サンプルです。「ListBoxWindow1」という画面で作成していますが、「MainWindow」に書いても構いません。

  • スポンサーリンク


    <Window x:Class="ListBoxWindow1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:z04_NormalControls"
            mc:Ignorable="d"
            Title="ListBoxWindow1" Height="300" Width="300">
        
        <Grid>
    
            <ListBox Margin="10">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
            
        </Grid>
        
    </Window>
    

  •  ListBox には、選択モードが3種類あり SelectionMode に設定して切り替えます。 1つ目は、Single で、1つしか選択できません(Shift や Control を押したとしても)。 2つ目は、Multiple で、クリックするたびに選択、未選択が切り替わります。複数の項目を選択することも可能です。Shift や Control との連携は必要ありません。 3つ目は、Extended で、クリックのみだと1つだけ選択、Shift を押下しながらクリックとクリックで、その範囲全てを選択、Control を押下しながらクリックで、任意の複数項目を飛ばし飛ばしで選択可能です。

  • <Window x:Class="ListBoxWindow2"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:z04_NormalControls"
            mc:Ignorable="d"
            Title="ListBoxWindow2" Height="300" Width="300">
        
        <Grid>
    
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <ListBox Margin="10" SelectionMode="Single" Grid.Row="0">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
    
            <ListBox Margin="10" SelectionMode="Multiple" Grid.Row="1">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
    
            <ListBox Margin="10" SelectionMode="Extended" Grid.Row="2">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
            
        </Grid>
        
    </Window>
    

    スポンサーリンク


  •  続いてイベントです。選択項目を切り替えた時に発生する SelectionChanged イベントの例を以下に記載します。 ここでは、選択時の処理が全て同じ処理のため、1コントロール1イベントハンドラではなく、共通のイベントハンドラにまとめて紐づけています。

  • <Window x:Class="ListBoxWindow3"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:z04_NormalControls"
            mc:Ignorable="d"
            Title="ListBoxWindow3" Height="300" Width="300">
    
        <Grid>
    
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <ListBox Margin="10" SelectionMode="Single" Grid.Row="0"
                     SelectionChanged="SelectionChanged">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
    
            <ListBox Margin="10" SelectionMode="Multiple" Grid.Row="1"
                     SelectionChanged="SelectionChanged">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
    
            <ListBox Margin="10" SelectionMode="Extended" Grid.Row="2"
                     SelectionChanged="SelectionChanged">
                <ListBoxItem Content="牛丼" />
                <ListBoxItem Content="天丼" />
                <ListBoxItem Content="親子丼" />
            </ListBox>
    
        </Grid>
    
    </Window>
    

    Public Class ListBoxWindow3
    
        Private Sub SelectionChanged(sender As Object, e As SelectionChangedEventArgs)
    
            ' Remove は、変更前の選択項目
            If 0 < e.RemovedItems.Count Then
                Console.WriteLine($"")
                For Each subCtrl As ListBoxItem In e.RemovedItems
                    Console.WriteLine($"{subCtrl.Content} remove.")
                Next
            End If
    
            ' Add は、変更後の選択項目
            If 0 < e.AddedItems.Count Then
                For Each subCtrl As ListBoxItem In e.AddedItems
                    Console.WriteLine($"{subCtrl.Content} add.")
                Next
            End If
    
        End Sub
    
    End Class
    

  •  SelectionChanged イベントの引数からは、変更前と変更後の値を取得することができます。これを使って、変更した値を調べています。 イベント引数名には、RemovedItems, AddedItems とありますが、ここの例では、「選択項目の削除」や「新規項目の追加」という意味ではありません。

  •  それでは次に、プログラム上から値をセットしたバージョンです。

  • <Window x:Class="ListBoxWindow4"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:w04_NormalControls"
            mc:Ignorable="d"
            Title="ListBoxWindow4" Height="300" Width="300"
            Loaded="Window_Loaded">
      
        <Grid>
    
            <ListBox Name="listbox1" Margin="10" 
                     SelectionChanged="listbox1_SelectionChanged" />
    
        </Grid>
        
    </Window>
    

    Public Class ListBoxWindow4
    
        Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    
            Dim items = Enumerable.Range(1, 100)
            Me.listbox1.ItemsSource = items
    
        End Sub
    
        Private Sub listbox1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs)
    
            ' Remove は、変更前の選択項目
            If 0 < e.RemovedItems.Count Then
                Console.WriteLine($"")
                For Each item As String In e.RemovedItems
                    Console.WriteLine($"{item} remove.")
                Next
            End If
    
            ' Add は、変更後の選択項目
            If 0 < e.AddedItems.Count Then
                For Each item As String In e.AddedItems
                    Console.WriteLine($"{item} add.")
                Next
            End If
    
        End Sub
    
    End Class