如何循环递归获取WPF树的所有节点

heyusuo 2013-08-21 09:51:19
我已经动态生成了一棵树,用的是TREEVIEW控件,现在我想要获取这棵树的所有节点值并存在一个数组里面,要怎么样循环递归获取呢,请高人给点实例代码,谢谢!是WPF不是WEB哦,呵呵
...全文
252 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bonjour-你好 2013-08-21
  • 打赏
  • 举报
回复
<Window x:Class="WpfTest.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <TreeView Height="200" HorizontalAlignment="Left" Margin="20,12,0,0" Name="dazltree" VerticalAlignment="Top" Width="120" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="181,30,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <RichTextBox Height="157" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Left" Margin="156,75,0,0" Name="richTextBox1" VerticalAlignment="Top" Width="110" />
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace WpfTest
{
    /// <summary>
    /// Window2.xaml 的交互逻辑
    /// </summary>
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            TreeViewItem tviRoot = new TreeViewItem();
            tviRoot.Header = "根目录";
            dazltree.Items.Add(tviRoot);

            TreeViewItem tviChild1 = new TreeViewItem();
            tviChild1.Header = "子目录1";
            tviRoot.Items.Add(tviChild1);

            TreeViewItem tviChild2 = new TreeViewItem();
            tviChild2.Header = "子目录2";
            tviRoot.Items.Add(tviChild2);

            for (Int32 i = 1; i < 4; i++) {
                TreeViewItem tviTemp1 = new TreeViewItem();
                tviTemp1.Header = "子目录1." + i.ToString();
                tviChild1.Items.Add(tviTemp1);

                TreeViewItem tviTemp2 = new TreeViewItem();
                tviTemp2.Header = "子目录2." + i.ToString();
                tviChild2.Items.Add(tviTemp2);
            }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            List<String> result = new List<String>();

            foreach (var obj in dazltree.Items) {
                TreeViewItem temp = obj as TreeViewItem;
                if (temp != null) {
                    GetTreeViewHeader(temp,null, result);
                }
            }

            foreach (String objStr in result) {
                richTextBox1.AppendText("\r" + objStr);
            }
        }

        private void GetTreeViewHeader(TreeViewItem rootItem, TreeViewItem childItem ,List<String> result)
        {
            if (rootItem != null) {
                result.Add(rootItem.Header.ToString());

                foreach (var obj in rootItem.Items) {
                    TreeViewItem temp = obj as TreeViewItem;
                    if (temp != null) {
                        result.Add(temp.Header.ToString());

                        GetTreeViewHeader(null, temp, result);
                    }
                }
            } else {
                foreach (var obj in childItem.Items) {
                    TreeViewItem temp = obj as TreeViewItem;
                    if (temp != null) {
                        result.Add(temp.Header.ToString());

                        GetTreeViewHeader(null, temp, result);
                    }
                }
            }
        }
    }
}
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
求救,SOS
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
引用 6 楼 KumaPower 的回复:
“全部的节点的名称”指的是 Name属性还是Header属性?
WPF没有NAME属性哦,只有Header,我要的就是所有的Header然后保存到一个数组中去
Bonjour-你好 2013-08-21
  • 打赏
  • 举报
回复
“全部的节点的名称”指的是 Name属性还是Header属性?
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
在线急等,求救
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
引用 2 楼 KumaPower 的回复:
“所有节点值”的值指的是节点的哪个属性? PS:能否提供你动态生成树的简单代码(例如树节点是数字之类的,懒得写例子。。。)?
帮忙看看怎么实现
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
生成树的代码: //添加树的根目录 TreeViewItem tvi1 = new TreeViewItem(); BitmapImage bi = new BitmapImage(new Uri(dt.Rows[0]["ico"].ToString(), UriKind.Relative));//UriKind.Relative是相对路径 Image img = new Image(); img.Width = 16; img.Height = 16; img.Source = bi; //tvi1.Header = img; StackPanel sp = new StackPanel();//新建StackPanel容器 sp.Height = 18.5; sp.Name = "treesp"; sp.Orientation = Orientation.Horizontal;//设置排列方式为横向排列 sp.Children.Add(img); TextBlock tb = new TextBlock(); tb.Text = " " + dt.Rows[0]["lxmc"].ToString(); sp.Children.Add(tb); tvi1.Header = sp; tvi1.IsExpanded = true; dazltree.Items.Add(tvi1); //添加二级目录 for (int i = 1; i < int.Parse(dt.Rows.Count.ToString()); i++) { lxmc = dt.Rows[i]["lxmc"].ToString();//循环获取lxmc ico = dt.Rows[i]["ico"].ToString();//循环获取ico jdz = dt.Rows[i]["jdz"].ToString();//循环获取jdz TreeViewItem tvi2 = new TreeViewItem(); BitmapImage bi1 = new BitmapImage(new Uri(dt.Rows[i]["ico"].ToString(), UriKind.Relative));//UriKind.Relative是相对路径 Image img1 = new Image(); img1.Width = 16; img1.Height = 16; img1.Source = bi1; StackPanel sp1 = new StackPanel();//新建StackPanel容器 sp1.Height = 18.5; sp1.Name = "treesp1"; sp1.Orientation = Orientation.Horizontal;//设置排列方式为横向排列 sp1.Children.Add(img1); TextBlock tb1 = new TextBlock(); tb1.Text = " " + dt.Rows[i]["lxmc"].ToString(); sp1.Children.Add(tb1); tvi2.Header = sp1; tvi1.Items.Add(tvi2); } 目前只有二级目录,没有做成无限级目录树,我的意思是要怎么得到全部的节点的名称
Bonjour-你好 2013-08-21
  • 打赏
  • 举报
回复
“所有节点值”的值指的是节点的哪个属性? PS:能否提供你动态生成树的简单代码(例如树节点是数字之类的,懒得写例子。。。)?
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
有人会的吗?
heyusuo 2013-08-21
  • 打赏
  • 举报
回复
问题解决,非常感谢KumaPower ,结贴!

8,731

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧