04.選択された項目のパスを取得する
ツリービュー項目(TreeViewItem)は自分自身の親項目を表すParentプロパティを持っています。そこで、選択されている項目から再帰的に親項目を辿っていけば、現在選択されている項目のパスを得ることができます。
下記は、選択された項目のパスを取得する例です。GetCurrentPathという自作の関数で、指定された項目からルート項目までを再帰的に辿り、パスを表す文字列を作成します。
<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>
<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" />
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
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を追加します。
下記は、選択した項目に子項目を追加する例です。追加する子項目に設定するラベルはテキストボックスに入力された文字列を使用しています。
<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>
<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" />
''' <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
/// <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メソッドを使用する。