SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

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

(13) TreeViewコントロール

06.選択された項目を削除する

 ツリービューは選択された項目を直接削除するメソッドを持っていません。その代わりにツリービュー項目の子項目を削除する機能が提供されています。そこで、現在選択されている項目の親項目を取得して、その親項目から見た子項目を削除すれば、選択された項目を削除することになります。

 子項目の削除は、TreeViewItemクラスItemsプロパティが持つRemoveメソッドを使用します。

 しかし、選択された項目がルート項目の場合は親項目は存在しないため、TreeViewItemクラスのRemoveメソッドは使用することができません。そこで、TreeViewクラスItemsプロパティが持つRemoveAtメソッドを使用してルート項目を削除します。RemoveAtメソッドは引数に削除する項目のインデックス番号を指定します。TreeViewクラスのIndexOfメソッドを使用してルート項目のインデックス番号を調べ、RemoveAtメソッドに渡します。

 下記は、選択された項目を削除する例です。

選択された項目を削除する例
選択された項目を削除する例
XAMLの例(WPFの例)
<DockPanel Name="DockPanel1" LastChildFill="True">
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="3">
        <TextBlock Width="200" Text="選択項目名:" Name="TextBlock1" />
        <Button Name="btnDelete" Content="削除" />
    </StackPanel>
    <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の例)
<TextBlock Height="23" HorizontalAlignment="Left" Margin="12,49,0,0" Text="選択項目名:" 
           VerticalAlignment="Top" Name="TextBlock1" />
<Button Content="削除" Height="23" HorizontalAlignment="Left" Margin="210,45,0,0" 
        Name="btnDelete" VerticalAlignment="Top" Width="51" />
<sdk:TreeView Height="220" HorizontalAlignment="Left" Margin="10,78,0,0" 
              VerticalAlignment="Top" Width="251" 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>
VBの例
'選択項目格納用変数
Private selectedItem As TreeViewItem

''' <summary>
''' 選択項目をテキストブロックに表示する
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub TreeView1_SelectedItemChanged(ByVal sender As System.Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Object)) Handles TreeView1.SelectedItemChanged        
    '選択された項目を取得する
    selectedItem = DirectCast(TreeView1.SelectedItem, TreeViewItem)

    If selectedItem Is Nothing Then Return

    '選択項目のラベルをテキストブロックに表示する
    TextBlock1.Text = "選択項目名: " & selectedItem.Header
End Sub

''' <summary>
''' [削除]ボタンクリック時の処理
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnDelete.Click
    '項目が選択されているか?
    If Not IsNothing(selectedItem) Then
        '選択された項目がルート項目か?
        If TreeView1.Items.IndexOf(selectedItem) > -1 Then
            'ルート項目を削除
            TreeView1.Items.RemoveAt(TreeView1.Items.IndexOf(selectedItem))
        Else
            '選択項目の親項目を取得
            Dim parentItem As TreeViewItem = DirectCast(selectedItem, TreeViewItem).Parent
            '親項目から選択されている項目を削除する
            parentItem.Items.Remove(selectedItem)
        End If
    End If
End Sub
C#の例
// 選択項目格納用変数
private TreeViewItem selectedItem;

/// <summary>
/// 選択項目をテキストブロックに表示する
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    // 選択された項目を取得する
    selectedItem = (TreeViewItem)TreeView1.SelectedItem;

    if (selectedItem == null) return;

    // 選択項目のラベルをテキストブロックに表示する
    TextBlock1.Text = "選択項目名: " + selectedItem.Header;
}

/// <summary>
/// [削除]ボタンクリック時の処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
    // 項目が選択されているか?
    if (selectedItem != null)
    {
        // 選択された項目がルート項目か?
        if (TreeView1.Items.IndexOf(selectedItem) > -1)
            // ルート項目を削除
            TreeView1.Items.RemoveAt(TreeView1.Items.IndexOf(selectedItem));
        else
        {
            // 選択項目の親項目を取得
            TreeViewItem parentItem = (TreeViewItem)selectedItem.Parent;
            // 親項目から選択されている項目を削除する
            parentItem.Items.Remove(selectedItem);
        }
    }
}
ポイント

 子項目の削除は、TreeViewItemクラスのItemsプロパティが持つRemoveメソッドを使用する。

 ルート項目の削除はTreeViewクラスのItemsプロパティが持つRemoveAtメソッドを使用する。

次のページ
07.項目を展開/折りたたみする

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

Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5870 2011/04/19 14:00

イベント

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

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

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

メールバックナンバー