SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight/WPFで使える逆引きTips集

Silverlight/WPFで使える逆引きTips集
――ツリービュー機能

(13) TreeViewコントロール

  • X ポスト
  • このエントリーをはてなブックマークに追加

04.選択された項目のパスを取得する

 ツリービュー項目(TreeViewItem)は自分自身の親項目を表すParentプロパティを持っています。そこで、選択されている項目から再帰的に親項目を辿っていけば、現在選択されている項目のパスを得ることができます。

 下記は、選択された項目のパスを取得する例です。GetCurrentPathという自作の関数で、指定された項目からルート項目までを再帰的に辿り、パスを表す文字列を作成します。

選択された項目のパスを取得する例
選択された項目のパスを取得する例
XAMLの例(WPFの例)
<DockPanel Name="DockPanel1" LastChildFill="True">
    <TextBlock Name="TextBlock1" Margin="3" DockPanel.Dock="Bottom"/>
    <TreeView Name="TreeView1" DockPanel.Dock="Top">
        <TreeViewItem Header="親1" Name="TreeViewItem1">
            <TreeViewItem Header="子1" />
            <TreeViewItem Header="子2">
                <TreeViewItem Header="孫1">
                    <TreeViewItem Header="曾孫1" />
                    <TreeViewItem Header="曾孫2" />
                    <TreeViewItem Header="曾孫3" />
                </TreeViewItem>
                <TreeViewItem Header="孫2" />
            </TreeViewItem>
        </TreeViewItem>
    </TreeView>
</DockPanel>
XAMLの例(Silverlightの例)
<sdk:TreeView Height="220" HorizontalAlignment="Left" Margin="10,44,0,0" 
              VerticalAlignment="Top" Width="250" Name="TreeView1">
    <sdk:TreeViewItem Header="親" Name="rootItem">
        <sdk:TreeViewItem Header="子1" />
        <sdk:TreeViewItem Header="子2">
            <sdk:TreeViewItem Header="孫1">
                <sdk:TreeViewItem Header="曾孫1" />
                <sdk:TreeViewItem Header="曾孫2" />
                <sdk:TreeViewItem Header="曾孫3" />
            </sdk:TreeViewItem>
            <sdk:TreeViewItem Header="孫2" />
        </sdk:TreeViewItem>
    </sdk:TreeViewItem>
</sdk:TreeView>
<TextBlock Height="23" HorizontalAlignment="Left" Margin="12,270,0,0" 
           Name="TextBlock1" Text="TextBlock" VerticalAlignment="Top" />
VBの例
Private Sub TreeView1_SelectedItemChanged(ByVal sender As System.Object, 
    ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Object)) 
    Handles TreeView1.SelectedItemChanged

    '選択項目のパスをテキストブロックに表示する
    TextBlock1.Text = GetCurrentPath(TreeView1.SelectedItem)
End Sub

''' <summary>
''' 指定項目のパスを取得する
''' </summary>
''' <param name="item"></param>
''' <returns>パスを取得するツリービュー項目</returns>
''' <remarks>指定項目のパス</remarks>
Private Function GetCurrentPath(ByVal item As TreeViewItem) As String
    Dim strPath As String = item.Header.ToString()

    '親項目がTreeViewItemか?
    If DirectCast(item, TreeViewItem).Parent.GetType().Equals(GetType(TreeViewItem)) Then
        '親項目を変数にセット
        Dim parentItem As TreeViewItem = DirectCast(item.Parent, TreeViewItem)

        strPath = GetCurrentPath(parentItem) & " > " & strPath
    End If

    Return strPath
End Function
C#の例
private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    // 選択項目のパスをテキストブロックに表示する
    TextBlock1.Text = GetCurrentPath((TreeViewItem)TreeView1.SelectedItem);
}

/// <summary>
/// 指定項目のパスを取得する
/// </summary>
/// <param name="item">パスを取得するツリービュー項目</param>
/// <returns>指定項目のパス</returns>
private string GetCurrentPath(TreeViewItem item)
{
    string strPath = item.Header.ToString();

    // 親項目がTreeViewItemか?
    if (((TreeViewItem)item).Parent.GetType().Equals(typeof(TreeViewItem)))
    {
        // 親項目を変数にセット
        TreeViewItem parentItem = (TreeViewItem)item.Parent;

        strPath = GetCurrentPath(parentItem) + " > " + strPath;
    }

    return strPath;
}
ポイント

 ツリービュー項目は親を指し示すParentプロパティを持っている。

 Parentプロパティを再帰的に辿ることでパスを取得することができる。

05.選択した項目に子項目を追加する

 選択された項目に子項目を追加するには、TreeViewクラスのSelectedItemプロパティで現在選択されている項目を取得し、その項目に対してTreeViewItemを追加します。

 下記は、選択した項目に子項目を追加する例です。追加する子項目に設定するラベルはテキストボックスに入力された文字列を使用しています。

選択した項目に子項目を追加する例
選択した項目に子項目を追加する例
XAMLの例(WPFの例)
<DockPanel Name="DockPanel1" LastChildFill="True">
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="3">
        <TextBlock Text="追加項目名:" Name="TextBlock1" />
        <TextBox Width="150" Name="TextBox1" />
        <Button Name="btnAdd" Content="追加" />
    </StackPanel>
    <TreeView Name="TreeView1" DockPanel.Dock="Top">
        <TreeViewItem Header="親1" Name="TreeViewItem1">
            <TreeViewItem Header="子1" />
            <TreeViewItem Header="子2" />
            <TreeViewItem Header="子3" />
        </TreeViewItem>
    </TreeView>
</DockPanel>
XAMLの例(Silverlightの例)
<sdk:TreeView Height="220" HorizontalAlignment="Left" Margin="10,44,0,0" 
              VerticalAlignment="Top" Width="250" Name="TreeView1">
    <sdk:TreeViewItem Header="親" Name="rootItem">
        <sdk:TreeViewItem Header="子1" />
        <sdk:TreeViewItem Header="子2">
            <sdk:TreeViewItem Header="孫1">
                <sdk:TreeViewItem Header="曾孫1" />
                <sdk:TreeViewItem Header="曾孫2" />
                <sdk:TreeViewItem Header="曾孫3" />
            </sdk:TreeViewItem>
            <sdk:TreeViewItem Header="孫2" />
        </sdk:TreeViewItem>
    </sdk:TreeViewItem>
</sdk:TreeView>
<TextBlock Height="23" HorizontalAlignment="Left" Margin="12,270,0,0" 
           Name="TextBlock1" Text="TextBlock" VerticalAlignment="Top" />
VBの例
''' <summary>
''' [追加]ボタンクリック時の処理
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAdd.Click
    '選択された項目の取得
    Dim selectedItem As TreeViewItem = DirectCast(TreeView1.SelectedItem, TreeViewItem)
    '選択された項目に追加する子項目用変数
    Dim childItem As New TreeViewItem

    'TextBoxに文字が入力されていないか
    '項目が選択されていない場合は処理を行わない
    If TextBox1.Text.Length = 0 Or IsNothing(selectedItem) Then
        Return
    End If

    '子項目のラベルを設定
    childItem.Header = TextBox1.Text

    '選択項目に子項目を追加
    selectedItem.Items.Add(childItem)
End Sub
C#の例
/// <summary>
/// [追加]ボタンクリック時の処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
    // 選択された項目の取得
    TreeViewItem selectedItem = (TreeViewItem)TreeView1.SelectedItem;
    // 選択された項目に追加する子項目
    TreeViewItem childItem = new TreeViewItem();

    // TextBoxに文字が入力されていないか
    //項目が選択されていない場合は処理を行わない
    if (TextBox1.Text.Length == 0 || selectedItem == null)
        return;

    // 子項目のラベルを設定
    childItem.Header = TextBox1.Text;

    // 選択項目に子項目を追加
    selectedItem.Items.Add(childItem);
}
ポイント

 選択された項目に子項目を追加するには、TreeViewクラスのSelectedItemプロパティが持つItems.Addメソッドを使用する。

次のページ
06.選択された項目を削除する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5870 2011/04/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング