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