两张表是父级和子级的关系,部门信息表和员工信息表,员工表有部门idtry
            {
                tree = new TreeItem();
                string sql = "select e.id, e.name,s.seid, s.sename from employee e,section s where e.seid = s.seid";                DataTable dt = oct.getSelect(sql);//连表查询
                //部门表去除重复
                DataTable dtBm = dt.DefaultView.ToTable(true, "SENAME");                for (int i = 0; i < dtBm.Rows.Count; i++)
                {
                    TreeItem tv = new TreeItem();
                    tv.text = dtBm.Rows[i]["SENAME"].ToString();
                    tv.id = dt.Rows[i]["SEID"].ToString();                    DataRow[] drArr = dt.Select("SEID=" + tv.id + "");
                    DataTable dtNew = dt.Clone();
                    int j;
                    for (j = 0; j < drArr.Length; j++)
                    {
                        dtNew.ImportRow(drArr[j]);
                    }
                    for (int k = 0; k < j; k++)
                    {
                        TreeItem yg = new TreeItem();
                        yg.text = dtNew.Rows[k]["NAME"].ToString();
                        yg.id = dtNew.Rows[k]["ID"].ToString();
                        tv.children.Add(yg);
                        //yg.parent = tv;
                    }
                    tree.children.Add(tv);
                    //tv.parent = tree;
                }
                // 把数据绑定到控件
                treeViewMine.ItemsSource = tree.children;
            }
这是没有用递归,求助怎么用递归绑定

解决方案 »

  1.   

    首先,你这是直接赋值,不是用的绑定的方式。
    其次,如果绑定的话
     <TreeView ItemsSource={Binding SourceCollection}>
                        <TreeView.ItemTemplate>
                  
                        <HierarchicalDataTemplate  ItemsSource="{Binding Path=Children}">
                            <Grid>
                                     <Lable Content="{Binding Name}"/>
                            </Grid>
                        </HierarchicalDataTemplate>
                    
                    </TreeView.ItemTemplate>
                </TreeView>SourceCollection是你的顶级数据源集合,一般为ObservableCollection,集合中的数据有一个Children属性,一般也是ObservabelCollection,
      

  2.   


    那怎么递归呢,我不太会我的前台是这样的 <HierarchicalDataTemplate DataType="{x:Type local:TreeItem}"  ItemsSource="{Binding Path=children}" >
                        <StackPanel Orientation="Horizontal" Margin="0,2,0,2" >
                            <CheckBox Focusable="False" IsChecked="{Binding IsChecked,Mode=TwoWay}" VerticalAlignment="Center" />
                            <Image VerticalAlignment="Center" Source="{Binding itemIcon}" ></Image>
                            <TextBlock VerticalAlignment="Center" Text="{Binding text}" ToolTip="{Binding text}" />
                        </StackPanel>
                    </HierarchicalDataTemplate>
      

  3.   

    http://blog.csdn.net/hanjun0612/article/details/50563136
      

  4.   


    之前看到过,是winfrom的,和wpf有一点出入,而且只有一张表
      

  5.   


    <Window x:Class="WpfApp3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/up-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp3"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TreeView x:Name="tvTest" ItemsSource="{Binding SourceCollection}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <Grid>
                            <Label Content="{Binding Name}"/>
                        </Grid>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </Grid>
    </Window>    /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public MainWindow()
            {
                InitializeComponent();
                DataContext = new ViewModel();
            }
        }    public class ViewItemModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;        private string _name = "";
            private ObservableCollection<ViewItemModel> _children = new ObservableCollection<ViewItemModel>();        public string Name
            {
                get
                {
                    return _name;
                }
                set
                {
                    _name = value;
                    if(PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }        public ObservableCollection<ViewItemModel> Children
            {
                get { return _children; }
                set
                {
                    _children = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }
        }
        public class ViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public ObservableCollection<ViewItemModel> SourceCollection { get; set; }        public ViewModel()
            {
                SourceCollection = new ObservableCollection<ViewItemModel>();            for (int i = 0; i < 3; i++)
                {
                    ViewItemModel vim = new ViewItemModel();
                    vim.Name = "部门-" + i;                for(int j = 0; j < 3; j++)
                    {
                        ViewItemModel childVim = new ViewItemModel();
                        childVim.Name = "员工-" + i.ToString() + "-" + j.ToString();
                        vim.Children.Add(childVim);
                    }                SourceCollection.Add(vim);
                }
            }
        }只要往每一层的Children集合中加入数据,就可以实现多层显示。
      

  6.   


    之前看到过,是winfrom的,和wpf有一点出入,而且只有一张表
    这只是一个方向。我不清楚wpf和winform,如果控件都是绑定数据源的话,那应该也没什么问题。
    至于多表,感觉只是链表查询的问题。