1 internal class BinaryNodeItem //作用于内部的自定义类型 2 { 3 public int ID { get; set; } //对应SQL表中id值,本节点ID 4 public string Name { get; set; } //对应SQL表中name值,用作显示文字 5 public int ParentID { get; set; } //对应SQL表中parent_id值,父节点ID 6 public bool IsExpanded { get; set; } //是否展开 7 public List<BinaryNodeItem> Items { get; set; } //一个List作为普通TreeViewItem中的Items来用,注意T类型要相同 8 public BinaryNodeItem() { Items = new List<BinaryNodeItem>(); } //在实例化BinaryNodeItem的时候自动实例化它的Items,否则给 null 对象 Add 会抛错 9 } 10 11 BindingList<BinaryNodeItem> bnis = new BindingList<BinaryNodeItem>();//在循环体外部实例化一个自定义类型的集合,BindingList 和普通的 List 比,有一个好处是后台对 BindingList 中的内容更新的时候,控件的显示会自动更新 12 13 //设置树状图数据源 14 //参数1:父级节点[因为根节点的话父级是TreeView本身所以类型得用万能的obejct] 15 //参数2:查询的表名,这里是role_body表,SQL_Doc.SQL_Fetch是我自己写的事件,返回一个包含查询结果的DataSet,这里自行查询所用的SQL的使用说明,之后有机会也会把自己的发到博客里可以搜索看看 16 //参数3:用于循环查询的父级ID[自己调用时保持默认,这个参数是给事件内部循环调用,查询 WHERE parent_id=xx 的时候用的]) 17 private BindingList<BinaryNodeItem> SetTreeViewSource(object Parent, string Table, int ParentID = -1) 18 { 19 //获取根节点,准备数据源,假设已有表格 20 DataTable dt = SQL_Doc.SQL_Fetch("SELECT * FROM " + Table + " WHERE parent_id = " + ParentID.ToString()).Tables[0]; 21 //生成用于绑定的列表 22 if (ParentID == -1) { bnis = new BindingList<BinaryNodeItem>(); } 23 foreach (DataRow r in dt.Rows) //对每一个需要添加的根节点 24 { 25 BinaryNodeItem bni = new BinaryNodeItem() //实例化一个根节点并填充数据 26 { 27 Name = r["name"].ToString(), 28 ID = Convert.ToInt32(r["id"]), 29 ParentID = Convert.ToInt32(r["parent_id"].ToString()), 30 IsExpanded = true 31 }; 32 SetTreeViewSource(bni, Table, bni.ID); //循环添加子节点(父级节点,表名,父级节点的ID) 33 //把此节点加入到父级节点(对根节点则加入用于填充TreeView的数据源)中 34 if (ParentID == -1) { bnis.Add(bni); } else {((BinaryNodeItem)Parent).Items.Add(bni); } 35 } 36 37 return bnis; //设置数据源 38 }
1 <TreeView.ItemContainerStyle> 2 <Style TargetType="{x:Type TreeViewItem}"> 3 <Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter> 4 </Style> 5 </TreeView.ItemContainerStyle> 6 7 <TreeView.ItemTemplate> 8 <HierarchicalDataTemplate ItemsSource="{Binding Path=Items}"> 9 <TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap"></TextBlock> 10 </HierarchicalDataTemplate> 11 </TreeView.ItemTemplate>
1 TreeView1.ItemsSource = SetTreeViewSource(TreeView1, "role_body"); //参数1为需要填充的TreeView,参数2为string类型的表名
顺便迫切要吐槽 cnblogs 输入代码的对话框,按ESC不保存直接退出对话框,输入法打错重打也是按ESC,表示为了输入一些注释,不小心按了ESC超过7次,重写了注释7次……