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