TreeView绑定SQL数据源
TreeView後台绑定数据源
// {
// if (hidNodeId.Value.ToString().IndexOf(treeNode.Value.ToString()) == 0)
// { treeNode.Expand(); }
//}
CreateChildTree(nodeId, fatherNode);
SysFunUpdate.Nodes.Add(fatherNode);
}
////选中的子菜单其父节点打开
//得到第一层节点的显示名称
string displayName = ds.Tables[0].Rows[i]["shopClassname"].ToString();
//根据节点信息创建一层节点
TreeNode fatherNode = CreateTreeNode(displayName, nodeId, "images/up01.gif");
//if (hidNodeId.Value.ToString() != "" && hidNodeId.Value.ToString().Length > 3)
//{
// foreach (TreeNode treeNode in SysFunUpdate.Nodes)
//if (nodeId != "143")
//{
// fatherNode.Target = "";
// fatherNode.NavigateUrl = "DianXinAnli.aspx?ColId=" + nodeId;
C# 递归的应用 TreeView递归绑定数据
递归在WinForm中的应用最近做项目经常用到递归,刚开始很久没用,不太熟悉,现在研究了下,并写下了学习笔记及开发经验总结。
递归热身一个算法调用自己来完成它的部分工作,在解决某些问题时,一个算法需要调用自身。
如果一个算法直接调用自己或间接地调用自己,就称这个算法是递归的(Recursive)。
根据调用方式的不同,它分为直接递归(Direct Recursion)和间接递归(Indirect Recursion)。
比如,在收看电视节目时,如果演播室中也有一台电视机播放的是与当前相同的节目,观众就会发现屏幕里的电视套有一层层的电视画面。
这种现象类似于直接递归。
如果把两面镜子面对面摆放,便可从任意一面镜子里看到两面镜子无数个影像,这类似于间接递归。
一个递归算法必须有两个部分:初始部分(Base Case)和递归部分(Recursion Case)。
初始部分只处理可以直接解决而不需要再次递归调用的简单输入。
递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。
函数的递归调用可以理解为:通过一系列的自身调用,达到某一终止条件后,再按照调用路线逐步返回。
递归是程序设计中强有力的工具,有很多数学函数是以递归来定义的。
如大家熟悉的阶乘函数,我们可以对n!作如下定义:f(n)=1 (n=1)n*f(n-1) (n>=2)一个算法具有的特性之一就是有穷性(Finity):一个算法总是在执行有穷步之后结束,即算法的执行时间是有限的。
递归算法当然也是算法,也满足算法的特性,因此递归不可能无限递归下去,总有一个终止条件。
对该示例,递归的终止条件是n=1. 当n=1是,返回1,不在调用自己本身,递归结束。
class Program{static void Main(string[] args){long result= function(20);Console.WriteLine(result);Console.ReadLine();}static long function(long n){if(n== 1) //算法终止条件{return1;}return n* function(n- 1);}}递归算法通常不是解决问题最有效的计算机程序,因为递归包含函数调用,函数调用需要时空开销。
C#中的treeview绑定数据库(递归算法)
C#中的treeview绑定数据库(递归算法)近⽇⾯试的给我两道题⽬,⼀道是IQ测试,第⼆个就是题⽬所⾔总共两个表 department(id int not null primary key,parentid int,name char(50));employee(id int not null foreign key(id) references department(id) ,departmentid,name char(50));实现的代码记录如下using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data.SqlClient;public partial class Default01 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){fill_Tree();}void fill_Tree(){SqlConnection SqlCon = new SqlConnection("server=(local);uid=sa;pwd=sa;database=test");SqlCon.Open();SqlCommand SqlCmd = new SqlCommand("Select id,name from department", SqlCon);SqlDataReader Sdr = SqlCmd.ExecuteReader();SqlCmd.Dispose();string[,] ParentNode = new string[10000, 2];int count = 0;while (Sdr.Read()){ParentNode[count, 0] = Sdr.GetValue(Sdr.GetOrdinal("id")).ToString();ParentNode[count++, 1] = Sdr.GetValue(Sdr.GetOrdinal("name")).ToString();}Sdr.Close();for (int loop = 0; loop < count; loop++){TreeNode root = new TreeNode();root.Text = ParentNode[loop, 1];root.Target = "_blank";root.NavigateUrl = "Default01.aspx";SqlCommand Module_SqlCmd = new SqlCommand("Select name,id from employee where departmentid =" + ParentNode[loop, 0], SqlCon); SqlDataReader Module_Sdr = Module_SqlCmd.ExecuteReader();while (Module_Sdr.Read()){TreeNode child = new TreeNode();child.Text = Module_Sdr.GetValue(Module_Sdr.GetOrdinal("name")).ToString();child.Target = "_blank";child.NavigateUrl = "Default01.aspx";root.ChildNodes.Add(child);}Module_Sdr.Close();TreeView1.Nodes.Add(root);}TreeView1.CollapseAll();SqlCon.Close();}protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) {}}。
wpf之TreeView绑定
wpf之TreeView绑定wpf绑定TreeView,貌似⽐winForm可能要⿇烦⼀些,不过仔细分析⼀下,还是很好解决的,最近做了⼀个项⽬,正好写了⼀下,下⾯把代码贴出来和⼤家分享⼀下先看⼀个简单的绑定View Code//代码绑定TreeView2private void BindTreeView2(){TreeViewItem item1 = new TreeViewItem() { Header = "节点⼀" };TreeViewItem item11 = new TreeViewItem() { Header = "节点1-1" };item11.Items.Add("aaaa");item11.Items.Add("bbbb");item11.Items.Add("cccc");item11.Items.Add("dddd");item1.Items.Add(item11);item1.Items.Add("cccc");item1.Items.Add("dddd");TreeViewItem item2 = new TreeViewItem() { Header = "节点⼆" };item2.Items.Add("aaaa");item2.Items.Add("bbbb");item2.Items.Add("cccc");item2.Items.Add("dddd");treeView2.Items.Add(item1);treeView2.Items.Add(item2);}private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){string dd = treeView2.SelectedItem as string;MessageBox.Show(dd);}然后在看看动态绑定⾸先、需要创建⼀个节点类,包括节点名称,图⽚,内容等,另外为了可以增加⼦节点,在加⼀个泛型IList,类型就是节点类本⾝View Code///<summary>///节点类///</summary>internal class PropertyNodeItem{public string Icon { get; set; }public string EditIcon { get; set; }public string DisplayName { get; set; }public string Name { get; set; }public int id { get; set; }public int parentId{get;set;}public bool IsExpanded { get; set; }public List<PropertyNodeItem> Children { get; set; }public PropertyNodeItem(){Children = new List<PropertyNodeItem>();}}然后从数据库中读取根节点绑定到treeView中View CodeWebDictClassServices.WebDictClass webDict = new WebDictClass();//根节点添加到treeVIew中private void loadTree(){tvProperties.Items.Clear();//加载根节点前先清除Treeview控件项List<PropertyNodeItem> itemList = new List<PropertyNodeItem>();DataTable dt=webDict.GetArticles();DataView dv = dt.DefaultView;dv.RowFilter = " ClassType='3' and ParentId=0 ";PropertyNodeItem node = new PropertyNodeItem(){DisplayName = dv[0].Row["title"].ToString(),Name = dv[0].Row["title"].ToString(),id=Convert.ToInt32(dv[0].Row["id"].ToString()),parentId=Convert.ToInt32(dv[0].Row["ParentId"].ToString()),IsExpanded=true};int id =Convert.ToInt32(dv[0]["id"].ToString());int pid = Convert.ToInt32(dv[0]["ParentId"].ToString());ForeachPropertyNode(node, id);itemList.Add(node);Properties.ItemsSource = itemList;}然后,在 ForeachPropertyNode⽅法中,实现了⽆限极节点View Code//⽆限接循环⼦节点添加到根节点下⾯private void ForeachPropertyNode(PropertyNodeItem node,int pid){DataTable dtDict = webDict.GetArticles();DataView dvDict = dtDict.DefaultView;dvDict.RowFilter = " ClassType='3' and ParentId=" + pid;if (dvDict.Count > 0){foreach (DataRowView view in dvDict){int id = Convert.ToInt32(view["id"].ToString());string name = view["title"].ToString();int parentId = Convert.ToInt32(view["ParentId"].ToString());PropertyNodeItem childNodeItem = new PropertyNodeItem(){DisplayName = name,Name = name,id=id,parentId=parentId,IsExpanded=false};ForeachPropertyNode(childNodeItem, id);node.Children.Add(childNodeItem);}}}如果我们想触发点击节点事件View Code//选中节点事件private void tvProperties_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) {PropertyNodeItem item = Properties.SelectedItem as PropertyNodeItem;string nodeText= ;// MessageBox.Show(nodeText);}前台的xaml⽂件<TreeView Height="264" x:Name="tvProperties" Width="220" SelectedItemChanged="tvProperties_SelectedItemChanged"> <TreeView.ItemContainerStyle><Style TargetType="{x:Type TreeViewItem}"><Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter></Style></TreeView.ItemContainerStyle><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"><StackPanel Orientation="Horizontal"><Image VerticalAlignment="Center" Source="{Binding Icon}" Width="16" Height="16" Margin="0,0,2,2"></Image><TextBlock VerticalAlignment="Center" Name="nodeName" Text="{Binding DisplayName}"></TextBlock><Image VerticalAlignment="Center" Source="{Binding EditIcon}" Margin="2,0,0,0"></Image><StackPanel.ToolTip><TextBlock VerticalAlignment="Center" Text="{Binding Name}" TextWrapping="Wrap" MaxWidth="200"></TextBlock></StackPanel.ToolTip></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView>可以发现,我们绑定的节点是类型的,到时候都可以转化过去,从⽽取得相关的值。
C#关于treeview的绑定和右键菜单添加删除子节点
C#关于treeview的绑定和右键菜单添加删除子节点最近,使用到了winform的treeview控件,在网上看了好多关于treeview控件使用方法的介绍都不全面。
于是我这个菜鸟进行了写了点东西出来,还请高手不要见笑。
自此也就当作是自己学习的一种反省和记录吧,另外朋友们要是不嫌弃的话可以拿去用。
闲话少说,上代码:一、treeview 控件绑定数据库的操作关于数据库的绑定,参考了网上高手们写的demo,别笑话我,哈哈。
代码1 public void AddTree(int ParentID, TreeNode pNode, TreeView productTypeTree)23 {45 string sql = "select category_sn, category_name, parent_sn from st_product_category";67 DataTable dt = DBHelper.ta(sql, 1);89 TreeNode tn1 = new TreeNode();1011 DataView dvTree = new DataView(dt);1213 //过滤ParentID,得到当前的所有子节点1415 dvTree.RowFilter = "[parent_sn] = " + ParentID;1617 foreach (DataRowView Row in dvTree)1819 {2021 if (pNode == null)2223 { //添加根节点2425 tn1.Text = Row["category_name"].T oString();2627 productTypeTree.Nodes.Add(tn1);2829 tn1.ExpandAll();3031AddTree(Int32.Parse(Row["category_sn"].T oString()), tn1, productTypeTree); //再次递归3233 }3435 else3637 { //添加当前节点的子节点3839 TreeNode tn2 = new TreeNode();4041 tn2.Text = Row["category_name"].T oString();4243 pNode.Nodes.Add(tn2);4445 tn1.ExpandAll();4647AddTree(Int32.Parse(Row["category_sn"].T oString()), tn2, productTypeTree); //再次递归4849 }5051 }5253 productTypeTree.ExpandAll();5455 }二、在为treeview 控件添加右键菜单(添加节点,删除节点)在treeview的节点点击事件中添加右键菜单(TreeView1_NodeMouseClick)private void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Button != MouseButtons.Right) return;if (e.Node.Level == 0) return;TreeNode currentNode = this.productTypeTree.GetNodeAt(new Point(e.X, e.Y));ContextMenuStrip cms = new ContextMenuStrip();if (currentNode != null){ToolStripMenuItem editAddproduct = new ToolStripMenuItem("添加兄弟节点");ToolStripMenuItem editAddprChildoduct = new ToolStripMenuItem("添加子节点");ToolStripMenuItem editDeleteproduct = new ToolStripMenuItem("删除节点");editAddproduct.Click += new EventHandler(editAddproduct_Click);editAddprChildoduct.Click += new EventHandler(editAddChildProduct_Click);editDeleteproduct.Click += new EventHandler(editDeleteproduct_Click);cms.Items.Add(editAddproduct);cms.Items.Add(editAddprChildoduct);cms.Items.Add(editDeleteproduct);cms.Show(this.productTypeTree, e.X, e.Y);this.productTypeTree.SelectedNode = currentNode;}}三实现右键菜单的点击事件1 添加子节点23 void editAddChildProduct_Click(object sender, EventArgs e)4 {5 TreeNode tn = this.productTypeTree.SelectedNode;6 AddChildNode(tn, "新节点");7 this.productTypeTree.ExpandAll();8 }9 //删除节点10 void editDeleteproduct_Click(object sender, EventArgs e)11 {12 TreeNode treenode = this.productTypeTree.SelectedNode;13 this.DeleteNode(treenode);14 this.productTypeTree.ExpandAll();15 }16 // 添加兄弟节点17 void editAddproduct_Click(object sender, EventArgse)18 {19 TreeNode tn = this.productTypeTree.SelectedNode;20 AddtreeNode(tn, "新节点");21 this.productTypeTree.ExpandAll();22 }2324 //添加兄弟节点25 private void AddtreeNode(TreeNode Node, string NewNodeName)26 {27 TreeNode parentNode = Node.Parent;28 TreeNode newNode = new TreeNode(); newNode.Text = NewNodeName;29 if (parentNode != null)30 {31 if (!parentNode.Nodes.Contains(newNode))32 {33 parentNode.Nodes.Add(newNode);34 }35 else return;36 }37 }38 //添加子节点39 private void AddChildNode(TreeNode tn, string NewChileName)40 {41 TreeNode newChildNode = new TreeNode();42 newChildNode.Text = NewChileName;43 tn.Nodes.Add(newChildNode);44 }4546 //删除节点47 private void DeleteNode(TreeNode treenode)48 {49 if (treenode.Nodes.Count==0) //如果该节点下没有子节点直接删除50 {51 this.productTypeTree.Nodes.Remove(treenode);52 }53 else if (treenode.Nodes.Count>0)//该节点下有节点提示是否全部删除该节点的所有内容54 {55 if ((MessageBox.Show("是否删除该项目下的所有子项?","警告",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning))==D ialogResult.OK)56 {57 this.productTypeTree.Nodes.Remove(treenode);58 }59 }60 }多余的解释我就不写了,详细大家都能够看得懂。
详解TreeView绑定数据库
详解TreeView绑定数据库很多应⽤要⽤到TreeView来显⽰组织机构,以下演⽰TreeView如何与数据库进⾏绑定。
数据库结构如下(递归现实):id(guid) pid(guid) name18a83618-8751-47ef-91a0-e2dcde42bb71 **公司c775c004-48ed-4664-8b0c-8fd26fea5f4e 18a83618-8751-47ef-91a0-e2dcde42bb71 A部门a43696f0-a906-4b4a-8abf-a01fb7d54daf c775c004-48ed-4664-8b0c-8fd26fea5f4e A部门->1班组0d7fb83a-c056-482e-800b-52e20c74791b c775c004-48ed-4664-8b0c-8fd26fea5f4e A部门->2班组de28685a-aaff-4876-abe1-bb003d17db64 18a83618-8751-47ef-91a0-e2dcde42bb71 B部门绑定到TreeView的最终效果如下图:1、新建⼀个TreeView控件⼆、绑定2.1 传统做法(⾏不通)2.2 正确做法:⾃⼰建⽴⼀个递归的⽅法。
2.2.1 递归其实就是⽅法的重复调⽤,下⾯是我总结的两种⽅法,对于初学者来说不明⽩其中的代码也没关系,直接拷贝下来⽤就可以了。
#region 绑定TreeView/// <summary>/// 绑定TreeView(利⽤TreeNode)/// </summary>/// <param name="p_Node">TreeNode(TreeView的⼀个节点)</param>/// <param name="pid_val">⽗id的值</param>/// <param name="id">数据库 id 字段名</param>/// <param name="pid">数据库⽗id 字段名</param>/// <param name="text">数据库⽂本字段值</param>protected void Bind_Tv(DataTable dt,TreeNode p_Node, string pid_val, string id, string pid, string text){DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据TreeNode tn;//建⽴TreeView的节点(TreeNode),以便将取出的数据添加到节点中//以下为三元运算符,如果⽗id为空,则为构建“⽗id字段 is null”的查询条件,否则构建“⽗id字段=⽗id字段值”的查询条件string filter = string.IsNullOrEmpty(pid_val) ? pid+" is null" : string.Format(pid+"='{0}'", pid_val);dv.RowFilter = filter;//利⽤DataView将数据进⾏筛选,选出相同⽗id值的数据foreach (DataRowView row in dv){tn = new TreeNode();//建⽴⼀个新节点(学名叫:⼀个实例)if (p_Node==null)//如果为根节点{tn.Value = row[id].ToString();//节点的Value值,⼀般为数据库的id值tn.Text = row[text].ToString();//节点的Text,节点的⽂本显⽰TreeView1.Nodes.Add(tn);//将该节点加⼊到TreeView中Bind_Tv(dt,tn, tn.Value, id, pid, text);//递归(反复调⽤这个⽅法,直到把数据取完为⽌)}else//如果不是根节点{tn.Value = row[id].ToString();//节点Value值tn.Text = row[text].ToString();//节点Text值p_Node.ChildNodes.Add(tn);//该节点加⼊到上级节点中Bind_Tv(dt,tn, tn.Value, id, pid, text);//递归}}}/// <summary>/// 绑定TreeView(利⽤TreeNodeCollection)/// </summary>/// <param name="tnc">TreeNodeCollection(TreeView的节点集合)</param>/// <param name="pid_val">⽗id的值</param>/// <param name="id">数据库 id 字段名</param>/// <param name="pid">数据库⽗id 字段名</param>/// <param name="text">数据库⽂本字段值</param>private void Bind_Tv(DataTable dt,TreeNodeCollection tnc, string pid_val, string id, string pid, string text){DataView dv = new DataView(dt);//将DataTable存到DataView中,以便于筛选数据TreeNode tn;//建⽴TreeView的节点(TreeNode),以便将取出的数据添加到节点中//以下为三元运算符,如果⽗id为空,则为构建“⽗id字段 is null”的查询条件,否则构建“⽗id字段=⽗id字段值”的查询条件string filter = string.IsNullOrEmpty(pid_val) ? pid + " is null" : string.Format(pid + "='{0}'", pid_val);dv.RowFilter = filter;//利⽤DataView将数据进⾏筛选,选出相同⽗id值的数据foreach (DataRowView drv in dv){tn = new TreeNode();//建⽴⼀个新节点(学名叫:⼀个实例)tn.Value = drv[id].ToString();//节点的Value值,⼀般为数据库的id值tn.Text = drv[text].ToString();//节点的Text,节点的⽂本显⽰tnc.Add(tn);//将该节点加⼊到TreeNodeCollection(节点集合)中Bind_Tv(dt, tn.ChildNodes, tn.Value, id, pid, text);//递归(反复调⽤这个⽅法,直到把数据取完为⽌)}}#endregion2.2.2 调⽤2.2.3 关于数据—》测试数据(作⽤:模拟⼀个真实的数据库表),这个⽅法的作⽤是建⽴⼀个表,表中有三个字段,分别为id、⽗id、名称,然后往⾥⾯插⼊些数据。
WPF新手之如何将数据绑定到TreeView
WPF新⼿之如何将数据绑定到TreeView看过许多例⼦,全是绑定到类的,没⼈说如何绑定到某个对象,偏偏我这个绝对的新⼿就是要绑定到⼀个对象,只能⾃⼰摸索了:⾸先要将数据绑定到容器,有以下⼏个默认条件:①元数据必须包装在List或者ObservableCollection中,后者具有动态更新的功能。
即,如果在程序中更改了ObservableCollection的值,与之绑定的控件会⾃动得到更新。
②待绑定的元数据可以是基本类型,也可以是复杂对象,这样就可以实际像TreeView这样的嵌套显⽰,但对象的每个成员都必须是基本类型,或者是ObservableCollection。
这⼀点我花了⼀天的时间才⾃⼰琢磨出来。
③类中的所有成员变量全部要以get、set设置其访问属性。
⼜花了我⼀天。
举例如下:[c-sharp]1. public class IPConfig2. {3. public IPAddress IP { get; private set; }4. public bool IPUseDHCP { get; private set; }5. //...6. public IPConfig()7. {8. this.IP = IPAddress.None;9. this.IPUseDHCP = false;10. }11. public IPConfig(string IPstr):this()12. {13. try14. {15. this.IP = IPAddress.Parse(IPstr);16. }17. catch (Exception)18. { }19. }20. }21. public class Profile22. {23. public string Name { get; private set; }24. public ObservableCollection<IPConfig> IPC { get; private set; }25. public Profile() {this.IPC = new ObservableCollection<IPConfig>();}26. public Profile( string name )27. {28. = name;29. this.IPC = new ObservableCollection<IPConfig>();30. }31. public Profile(string name, IPConfig ipc)32. {33. = name;34. this.IPC = new ObservableCollection<IPConfig>();35. this.IPC.Add(ipc);36. }37. }38. public ObservableCollection<Profile> _profiles = new ObservableCollection<Profile>();对数据源只要提供{Binding},然后在程序中设置DataContext来实现绑定。
treeview绑定数据库数据7页word
DataSet ds = new DataSet();string str0 = "SELECT lh, lmmc FROM tdlm WHERE (jb = 1) "; OleDbDataAdapter da0 = new OleDbDataAdapter(str0, cn);da0.Fill(ds, "tdlm0 ");int TableRow_Count0 = ds.Tables[ "tdlm0 "].DefaultView.Count;//求出ds中的"tdlm0 "表的总行数for(int i0 = 0; i0 < TableRow_Count0; i0++){DataRow dr0 = ds.Tables[ "tdlm0 "].Rows[i0];TN0 = new TreeNode();TN0.ID = dr0[0].ToString().Trim();TN0.Text = dr0[0].ToString() + dr0[1].ToString();TN0.Target = "main ";TN0.NavigateUrl = "cx1.asp?leimu= " + TN0.ID;TreeView.Nodes.Add(TN0);string str00 = String.Format( "SELECT lh, lmmc FROM tdlm WHERE (jb = 2) AND (sjlh = '{0} ') ", dr0[0].ToString().Trim());OleDbDataAdapter da00 = new OleDbDataAdapter(str00, cn);da00.Fill(ds, "tdlm00 ");int TableRow_Count00 = ds.Tables[ "tdlm00 "].DefaultView.Count;for(int i00 = 0; i00 < TableRow_Count00; i00++){DataRow dr00 = ds.Tables[ "tdlm00 "].Rows[i00];TN00 = new TreeNode();TN00.ID = dr00[0].ToString().Trim();TN00.Text = dr00[0].ToString() + dr00[1].ToString();TN00.Target = "main ";TN00.NavigateUrl = "cx1.asp?leimu= " + TN00.ID;TN0.Nodes.Add(TN00);}ds.Tables[ "tdlm00 "].Clear();}ds.Tables[ "tdlm0 "].Clear();数据库中首先有树的ID列和Text至于你想怎么显示还得看自己灵活运用String相加来显示Text值查看文章C#实现数据库与treeview的绑定并且能够获得所选的节点值2009年06月05日星期五 01:07在网上找了很多例子,现在看来是很浪费时间的,从MSDN上就有一个很好的例子,将这个例子理解了,对treeview绑定数据库就没有什么大的问题了。
datagridview绑定数据源的几种常见方式
datagridview绑定数据源的几种常见方式datagridview绑定数据源的几种常见方式//////////////开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定。
//////////////1)简单数据绑定//////////////////using (SqlConnection conn = new SqlConnection(Config urationManager.ConnectionStrings["connStr"].ToString()))//////////////////{////////////////// SqlDataAdapter sda = new SqlDataAdapter("Select * Fr om T_Class Where F_Type='Product' order by F_RootID,F_Orders", conn);////////////////// DataSet Ds = new DataSet();////////////////// sda.Fill(Ds, "T_Class");////////////////// //使用DataSet绑定时,必须同时指明DateMember////////////////// // = Ds;////////////////// // = "T_Class";////////////////// //也可以直接用DataTable来绑定////////////////// = Ds.Tables["T_Class"];//////////////////}//////////////简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性。
C#中treeview
TreeView绑定数据库(2009-09-07 11:25:58)转载▼标签:杂谈前台Default.aspx文件<asp:TreeView ID="tvMenu" runat="server" ImageSet="faq"ShowLines="true" ExpandDepth="1" Target="middle" Height="295px"OnLoad="tvMenu_Load" width="145px"><ParentNodeStyle Font-Bold="False" ForeColor="Black" /><HoverNodeStyle Font-Underline="True" ForeColor="Blue" /><SelectedNodeStyle Font-Underline="True" HorizontalPadding="0px" VerticalPadding="0px" ForeColor="Green" ImageUrl="~/images/folder.gif" /><NodeStyle Font-Names="Tahoma" Font-Size="8pt" ForeColor="DarkBlue" HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" /><RootNodeStyle BorderStyle="Dashed" /></asp:TreeView>后台Default.aspx.cs文件using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class _Default : System.Web.UI.Page{SqlConnection con = newSqlConnection(ConfigurationManager.ConnectionStrings["smsconnection"].ConnectionStrin g);DataSet ds;protected void Page_Load(object sender, EventArgs e){}private DataSet createDataSet(){ds = new DataSet();string sqlstr = "select * from Tree";SqlDataAdapter cmdSelect = new SqlDataAdapter(sqlstr, con);cmdSelect.Fill(ds, "Tree");return ds;}protected void InitTree(TreeNodeCollection Nds, string parentID) //用递归方法动态生成节点{DataView dv = new DataView();TreeNode tmpNode;dv.Table = ds.Tables["Tree"];dv.RowFilter = "pat_id=" + "'" + parentID + "'";foreach (DataRowView drv in dv){tmpNode = new TreeNode();tmpNode.Value = drv["node_id"].ToString();tmpNode.Text = drv["naode_name"].ToString();tmpNode.NavigateUrl = drv["url"].ToString();Nds.Add(tmpNode);this.InitTree(tmpNode.ChildNodes, tmpNode.Value);}}protected void tvMenu_Load(object sender, EventArgs e){if (!IsPostBack){tvMenu.Dispose();con.Open();this.createDataSet();con.Close();this.InitTree(tvMenu.Nodes, "0");}}}TreeView样式控制TreeView.ImageSet 属性TreeView.ImageSet 属性获取或设置用于TreeView 控件的图像组。
datagridview绑定数据源的几种常见方式
datagridview绑定数据源的几种常见方式datagridview绑定数据源的几种常见方式//////////////开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定。
//////////////1)简单数据绑定//////////////////using (SqlConnection conn = new SqlConnection(Config urationManager.ConnectionStrings["connStr"].ToString()))//////////////////{////////////////// SqlDataAdapter sda = new SqlDataAdapter("Select * Fr om T_Class Where F_Type='Product' order by F_RootID,F_Orders", conn);////////////////// DataSet Ds = new DataSet();////////////////// sda.Fill(Ds, "T_Class");////////////////// //使用DataSet绑定时,必须同时指明DateMember////////////////// //this.dataGridView1.DataSource = Ds;////////////////// //this.dataGridView1.DataMember = "T_Class";////////////////// //也可以直接用DataTable来绑定////////////////// this.dataGridView1.DataSource = Ds.Tables["T_Class"]; //////////////////}//////////////简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性。
C# 给TreeView控件绑定数据(ASP可作参考)
C# 给TreeView控件绑定数据(可作参考)本文采用的方法是使用一层for循环给treeview控件绑定数据!C# TreeView控件绑定数据在实际的开发过程中,有时候也会需要用到TreeView这个控件,用到这个控件的时候一般情况下都是与数据库离得数据配合使用的也就是将从数据库读取到的数据绑定到TreeView 控件上。
刚开始接触到这个控件的时候我也不知道如何绑定数据,在网上查了下,都是使用循环来绑定数据的,而且是两层循环。
找了个例子看了一下觉得使用两层循环有点繁琐,于是就自己动手试了下,使用一层循环来绑定数据,完全可以达到目的。
一般情况下TreeView都有1到多个根节点,而每个根节点都有0到多个子节点,这样的数据读取就会涉及到两张表或多张表,所以就需要联表查询。
在联表查询的时候,不同的查询方式肯定对查询的结果有所影响。
我所使用的是LEFT JOIN(左联)查询方式。
先看下最终的效果图:下面简单说下我的思路。
本次的例子涉及到两张表,分别是:A表:CREATETABLE A(aId INTPRIMARY KEY,aName V ARCHAR(30),)A表查询结果如下:B表:CREATETABLE B(bId INT,aId INT ,bName V ARCHAR(30),)B表查询结果如下:很显然,这两张表是有主外键关联的对这两张表联接查询,查询语句如下:SELECTA.aName '分组名称',B.bName '姓名'FROMALEFTJOINBONaId =B.aId查询结果如下:在绑定数据的时候会以A表中的aName这个字段作为TreeView的根节点,以B表中的bName作为子节点。
绑定后的结果如下:从联表查询的结果图来看,其中第四分组和第六分组后面的数据是NULL,也就是没有数据,但是在A表中这两条数据时存在的,所以在绑定数据的时候,在TreeView中的这两个根节点也是存在的,但是这两个根节点都没有子节点。
TreeView与数据库配合使用(C# WinForm+SQL Server 2008)
《企业信息化项目开发》上机内容TreeView与数据库配合使用(C# WinForm + SQL Server 2008)一、实训目标使用三层架构完成简单应用程序的开发二、涉及知识点1.使用三层架构完成简单的应用程序开发2.TreeView控件三、实训内容1.创建数据库和表2.搭建项目三层架构3.使用TreeView控件四、实训步骤1.创建数据库和表(1)新建一个名为“Test”的数据库。
CREATE DATABASE TestGOUSE TestGO(2)里边新建一张数据表叫做“Division”——行政区划表。
数据表如下:CREATE TABLE Division(ID int IDENTITY (1, 1)PRIMARY KEY,--自动增长的标记列NAME varchar (50)NOT NULL, --行政区划的名称ParentID int NOT NULL,--行政区划的上一级区划ID,最高级区划的上一级默认为0)GO插入测试数据Insert Into Division(NAME,ParentID)Values ('北京',0)Insert Into Division(NAME,ParentID)Values ('山东',0)Insert Into Division(NAME,ParentID)Values ('河北',0)Insert Into Division(NAME,ParentID)Values ('海淀',1)Insert Into Division(NAME,ParentID)Values ('中关村',4)Insert Into Division(NAME,ParentID)Values ('济宁',2)Insert Into Division(NAME,ParentID)Values ('曲阜',6)Insert Into Division(NAME,ParentID)Values ('济南',2)GO2.搭建项目三层架构(1)TreeViewModel实体类的实现:(2)TreeViewDAL层参考代码:(3)TreeViewBLL层参考代码:TreeView核心算法(使用递归算法实现):3.使用TreeView、图片框控件实现UI操作:(1)Tool类库(实现公共类)添加SQLDbHelper类:(2) TreeViewUI 层的实现:参考代码:五、课后作业预习用户控件的使用。
TreeView数据绑定的方法
•TreeView数据绑定的方法•最近作一个.net程序中涉及到权限的分配和管理,要把分为不同层次的权限从数据库中读出在树形控件TreeView中显示出来。
这里采取的是首先取出数据放在DataTable中,然后在递归查询中根据不同的filter条件得到对应树杈需要的数据。
这里使用类似的行政区划的数据表,数据表为:CREATE TABLE [dbo].[QuHua] ([ID] [int] IDENTITY (1, 1) NOT NULL ,--自增的标记列[NAME] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,--行政区划的名称[ParentID] [int] NOT NULL --行政区划的上一级区划ID,最高级区划的上一级默认为0) ON [PRIMARY]GO---插入测试数据Insert Into dbo.QuHua (NAME,ParentID) Values ('北京',0)Insert Into dbo.QuHua (NAME,ParentID) Values ('山东',0)Insert Into dbo.QuHua (NAME,ParentID) Values ('河北',0)Insert Into dbo.QuHua (NAME,ParentID) Values ('海淀',1)Insert Into dbo.QuHua (NAME,ParentID) Values ('中关村',4)Insert Into dbo.QuHua (NAME,ParentID) Values ('济宁',2)Insert Into dbo.QuHua (NAME,ParentID) Values ('曲阜',6)Insert Into dbo.QuHua (NAME,ParentID) Values ('济南',2)/// <summary>/// 根据递归查询结果动态生成TreeView/// 由于算法效率问题,不适合数据量的情况/// </summary>private void CreateTreeView(){string connetion = "Data Source=. ;Initial Catalog=MIS_New;Integrated Security=True";using (SqlConnection cn = new SqlConnection(connetion)){cn.Open();SqlDataAdapter da = new SqlDataAdapter("select * from QuHua", cn);DataTable dt = new DataTable();da.Fill(dt);//首先把第一级的行政区划取出生成TreeView的节点//作为递归运算的入口CreateTreeViewRecursive(treeView1.Nodes, dt, 0);}}/// <summary>/// 递归查询/// </summary>/// <param name="nodes">TreeView的节点集合</param>/// <param name="dataSource">数据源</param>/// <param name="parentid">上一级行政区划的标识码</param>private void CreateTreeViewRecursive(TreeNodeCollection nodes,DataTable dataSource,int parentid){string filter;filter = string.Format("parentid={0}", parentid);DataRow[] drarr = dataSource.Select(filter);TreeNode node;foreach (DataRow dr in drarr){node = new TreeNode();node.Text = (string)dr["name"];node.Tag = (int)dr["id"];nodes.Add(node);CreateTreeViewRecursive(node.Nodes,dataSource,(int)node.Tag);}}。
TreeView树形控件递归绑定数据库里的数据
TreeView树形控件递归绑定数据库⾥的数据TreeView树形控件递归绑定数据库⾥的数据。
第⼀种:性能不好第⼀步:数据库中查出来的表,字段名分别为UNAME(显⽰名称),DID(关联数据),UTYPE(类型)第⼆步:前台代码1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="tree.aspx.cs" Inherits="Maticsoft.Web.tree" %>23 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">45 <html xmlns="/1999/xhtml">6 <head runat="server">7 <title></title>8 <script type="text/javascript">9 function show(msg) {10 alert(msg);11 }12 </script>1314 </head>15 <body>1617 <form id="form1" runat="server">18 <div>19 <asp:TreeView ID="treeT" runat="server">20 </asp:TreeView>212223 </div>24 </form>25 </body>26 </html>第三步:后台代码1using System;2using System.Collections.Generic;3using System.Linq;4using System.Web;5using System.Web.UI;6using System.Web.UI.WebControls;7using System.Data;8using System.Data.SqlClient;910namespace Maticsoft.Web11 {12public partial class tree : System.Web.UI.Page13 {14 Maticsoft.BLL.G_USERS bll = new BLL.G_USERS();15 Maticsoft.Model.G_USERS model = new Model.G_USERS();1617protected void Page_Load(object sender, EventArgs e)18 {19//根节点的条件20 BindTree("8");21 }2223#region绑定⽗节点(第⼀级)24private void BindTree(string pid)25 {2627 DataSet ds = bll.GetList("a.status > -1 and utype=" + pid);28if (ds.Tables[0].Rows.Count > 0)29 {30for (int i = 0; i < ds.Tables[0].Rows.Count; i++)31 {32 TreeNode node = new TreeNode();33 node.Text = ds.Tables[0].Rows[i]["uName"].ToString();34 node.Target = ds.Tables[0].Rows[i]["dID"].ToString();35this.treeT.Nodes.Add(node);36 BindNode(node);37 }38 }39 }40#endregion4142#region绑定⼦节点4344#endregion45private void BindNode(TreeNode nd)46 {47 DataSet ds = bll.GetList("a.status>-1 and a.id=er_id and b.fid=" + Convert.ToString(nd.Target) + " order by b.shorder asc "); 48for (int i = 0; i < ds.Tables[0].Rows.Count; i++)49 {50 TreeNode node = new TreeNode();51 node.Text = ds.Tables[0].Rows[i]["uName"].ToString();52 node.Target = ds.Tables[0].Rows[i]["dID"].ToString();53 nd.ChildNodes.Add(node);5455//判断是否到最底层节点56if (ds.Tables[0].Rows[i]["utype"].ToString() != "0")57 {58 BindNode(node);59 }60 }61 }6263646566 }67 }效果功能图:另⼀种⼀步到位:(⼀次把所有数据放在数据集中,后⾯再查询)1using System;2using System.Collections.Generic;3using System.Linq;4using System.Web;5using System.Web.UI;6using System.Web.UI.WebControls;7using System.Data;8using System.Data.SqlClient;9using System.Data.OleDb;10namespace tree11 {12public partial class tree : System.Web.UI.Page13 {14protected void Page_Load(object sender, EventArgs e)15 {16if (!Page.IsPostBack)17 {18 DataSet ds = GetData();19 DataRow[] dr = ds.Tables[0].Select("utype=8");20 TreeNode node = new TreeNode();21 node.Text = dr[0]["UName"].ToString();22 node.Value = dr[0]["ID"].ToString();23this.TreeView1.Nodes.Add(node);24 BindTree(node, dr[0]["DID"].ToString(), ds);25 }26 }2728private void BindTree(TreeNode Nodes, string pid, DataSet ds)29 {30 DataRow[] dr = ds.Tables[0].Select("fid=" + pid, "shorder asc");31if (dr.Length > 0)32 {33for (int i = 0; i < dr.Length; i++)34 {35 TreeNode node = new TreeNode();36 node.Text = dr[i]["UName"].ToString();37 node.Value = dr[i]["ID"].ToString();38 Nodes.ChildNodes.Add(node);39if(dr[i]["utype"].ToString() !="0")40 BindTree(node, dr[i]["DID"].ToString(), ds);41 }42 }43 }4445private DataSet GetData()46 {47 OleDbConnection conn = new OleDbConnection(System.Configuration.ConfigurationManager.AppSettings["OleDbConnString"]);48 conn.Open();49string osqlstr ="select a.id,a.uname,a.utype,b.id did,b.fid,b.shorder from g_users A,G_DEPT B where a.status>-1 and a.id=er_id "; 5051 OleDbDataAdapter oda = new OleDbDataAdapter(osqlstr, conn);5253 DataSet ods = new DataSet();54 oda.Fill(ods);5556return ods;57 }58 }59 }。
vs2008 c# .net treeview 动态绑定数据库,增加、修改、删除节点
OleDbConnection cnn = new OleDbConnection(conString);
OleDbCommand com = new OleDbCommand(updatas, cnn); cnn.Open(); com.ExecuteNonQuery(); cnn.Close();
作为演示数据。 (1)、打开VS2008,新建一个网站项目,在Default.aspx中添加控件如下
(2)、在Default.aspx.cs文件里添加如下代码:
using System;
using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.SqlClient; using System.Windows.Forms; using System.Drawing; using System.Data.OleDb;
Source=.;uid=sa;pwd=sa;Database=Arm"; string delete = "delete from tb_treeview where
自-TreeView手动绑定数据
注:本人编程不久,网上对treeview手动绑定数据的案例太少,而在做企业开发时数据源控件多半会被禁止,所以手动绑定在某种意义上显得是必须的,而我那会儿也纠结于此,所以现在我在这里发一下牢骚,把自己写的一个方法共享一下,仅供参考,希望对遇到类似问题的朋友提供一丝的灵感,说的这么详细,也希望初学者可以学得更多,更多的是希望大家来为我指错,共同进步功能简介:对于树形目录,需要绑定的无三个东西,点击节点的url,展开节点所要显示的子节点,以及节点的显示文本,我弄出来的这个treeview在点击包含有子节点的父节点的时候实现的是展开节点,也就是说点击父节点不是一个超链接过程数据说明:我用的数据库字段涉及三列,其数据出自一个表,一个是name,用于作为节点的显示文本, parentid和id字段了,如果parentid空,则代表当前列为根目录(更节点),子节点与父节点的对应关系是,子节点的parentid对应父节点的id, id需要唯一标识,以此相关联,当然,如果级联设计成’死循环’,那这个就会出现堆栈溢出了,这个需要避免实现流程(按个人所需进行代码改造):1.获取数据查询出来的数据并处理为一个Dictionary<string, object>用于在前台解析绑定(我写的这个只涉及三列,结合附件查看,总之节点名称必须有,子节点和父节点关联字段必须有,剩下的字段就是点击最内层节点超链接地址所涉及的字段了)Dictionary<string, object>,对于这个,我提前说明一下,结合treeview的数据源是treenode,而treenode添加的子节点数据类型也是treenode,需要找个类似的结构,我就想到了这个,其集合的键是对应节点的文本,其值是object,就可以存Dictionary了,一个Dictionary集合对应一个treenode,数据结构相识了,转换起来就方便了,在使用时,结合treenode,首先遍历Dictionary中的数据,把其键作为所要在treenode节点位置所要显示的文本,其值做一个判断(结合dal58行和62行,100行和104行),判断是否还有子节点getClassBySiteId方法是我写的根据一个站点ID获取所需绑定的数据,童鞋们这里就可以结合自己需要的,借用方法重载之类手段按需灵活更改所要绑定的数据了,我用的返回值是Dictionary<string, object> ,一个泛型的键值对集合,因为treeview的结构类似无限级联,那么除了根节点特殊点,就应该用递归的方式读取子节点,这个就是getClass的工作了,这个方法只因为了实现递归,所以才和getClassBySiteId分离为两个方法,dal的86行的sql语句仅是用于验证参数ID对应的实体是否还有对应的下一级,如果没有,则返回一个null值的Dictionary,如果有,则继续解析.而这个结果用于在95行用户判断,当然这个流程用了递归,对于初学者理解起来可能有些头晕,所以要弄懂这些代码的一个实现流程,就需要弄懂递归了(递归的理论就是方法自己调用自己),大体流程就是这么的那我来详细说明一下,在getClassBySiteId方法用于外部调用,当调用时,返回值里面装用什么用途先不管,在47行,用于一个sql语句的变动,从而在51行根据sql语句处得到我们想要的数据(也可是datareader,datatable等),在55行处开始解析父节点,然后把父节点的ID和父节点所要显示的文本传递个getClass方法,(结合getClass中的代码),如果返回不为空(64行),则代表当前的根节点存在子节点, getClass方法就会返回对应的数据,那么就把节点所要显示的文本(数据库数据)作为键,把getClass的返回值作为值;如果返回值为空(95行),则当前的根节点无子节点,那么就把节点所要显示(数据库数据)的文本作为键,57行这里有个小技巧,.我们的UI层中的treeview被编译过后是一个<table>嵌<div>嵌<A>的形式存在于客户端的页面中,treeview的NavigateUrl属性值就会成为A标签的href的值,而我在集合中准备为NavigateUrl赋值的内容是集合的值,那么我在57行处就可以写html的脚本语言,如javascript等,而我点击最内层的节点是请求的就是url里面的地址了,直接写地址可以,调用javascript函数也可以.总之,点击节点的请求在这里处理完全,而我用的是调用javascript函数把id 传递给javascript,在javascript内部处理id,这个有点山寨webserver的感觉.回到主线上,上面就是treeview根节点所要绑定的数据,现在到了装载子节点的数据环节了, getC lass方法的第一个参数是传递一个父节点的ID,因为我的子节点与父节点相关联是通过parentid实现的,所以这个条件是必须的,而这个name这个当前节点的文本,考虑到访问数据库次数不宜太多,在加上在获取id的时候这个name也能顺便获取,故采用参数传递,在方法体内部,如果对应id下无parentid与之对应,则返回空,这个处理在上文提到过,如果不为空,则,遍历结果集(91行),94行一个递归,如果递归返回值为空,则代表当前id对应的数据库实体不包含子节点,那么应该对相应集合的值做特殊处理(99和100行)如果递归不为空,这递归返回的就是一个集合,数据属于object,则可以成为集合的值(treenode的add方法的参数是treenode, Dictionary的值是Dictionary,以此达到结构显示).其实,主要的两个方法内核处理都一样,在这里结果的处理就不多说了2.把上文处理返回的Dictionary<string, object>转换成treenode,用于添加到treeview中显示出来这个操作最好放在一个独立的的类文件中操作,不主张放到后置代码中,这个讲解过程中会提到,首先用同样地Dictionary<string, object>泛型集合接受dal中的对应方法的返回值(个人觉得这个操作放到bll里面比较合理一些),现在就是一个反读取的方式了,当然,这个treeview对象怎么过来我就不管了,我是把它作为参数传进来的,41行清空treeview节点(个人习惯,可省略),42行处就是为什么这些代码不能放到后置代码中的原因,实验证明, System.Web.UI.Page这个类对这段代码有冲突(不信你把这点代码放到后置代码中,然后把继承关系删了)42行代码处获取的集合(键集合)是为了在下面的集合遍历,这里的45行和46行是对节点的判断,结合上文,如果45行转换的集合对象不为空(47行),则代表的意思就是当前数据对应的节点还有子节点,那么当前节点的显示文本就是其对应的键,和list里面的值对应,就把其值(集合)和其文本传递给getNode0方法,这个方法的作用是解析数据对应的节点对象,第一个参数为节点的对应的子节点’集合’(结合上文),第二个参数是该节点所要显示的文本,借用上面相似的步骤判断,和装载Dictionary<string, object>有很多相似的地方,怎么取值,联想怎么装值的理解就容易多了,这里就不讲解很多了,编程吗,自己想通了才是自己的.对应点击最内层根节点该怎样处理,结合源码中装值过程与取值过程,以及鼠标放到根节点看浏览器左下角提示信息就不难了其实这个过程可以简化很多,可以把dataset解析为Dictionary<string, object>集合的时候直接把dataset直接转换成treenode,但我为了’贯彻’三层思想,以及treenode是前台对象,不宜与数据库操作混杂,所以分开处理,而且这个一半写在后台,一半写在前台还有个好处,如果是数据库数据也需要显示到cs的程序中,也可以代码二次利用.有点复杂,所以想让大众点评一下,看是否有更简洁易懂的方法,也好让我们共同进步发布日期 11 9-6附带的代码是已被成功用到项目中,请灵活修改,如有意见或想法,请在百度留言,或QQ留言本人QQ:282616513数据访问层:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;namespace WebCaptureDAL{public class Tv_datasourcedal{///<summary>///单例///</summary>private static Tv_datasourcedal dal = null;private static Object obj = new Object();private Tv_datasourcedal() { }public static Tv_datasourcedal CreateInstance(){if (dal == null){lock (obj){return dal = new Tv_datasourcedal();}}else{return dal;}}///<summary>///根据站点ID获取文章的类别和ID,由于无限级联///返回值为泛型集合///</summary>///<param name="siteid">站点ID</param>///<returns>可以嵌套自身的泛型集合</returns>public Dictionary<string, object> getClassBySiteId(int siteid){Dictionary<string, object> dic = null;string sql = "select id,[name] from ConntentClass where parentid is null";if (siteid >0){sql += " and SiteID="+siteid;}//根据sql语句获取查询的结果DataSet ds = JIZHI.DBHelper.JIZHIDBHelper.CreateInstance().Query(sql);if (ds != null){dic = new Dictionary<string, object>();foreach (DataRow item in ds.Tables[0].Select()){int id = Convert.ToInt32(item["id"]);Dictionary<string, object> dic1 = getClass(id, item["name"].ToString());if (dic1 == null){string url = "javascript:TreeToshow(" + item["id"].ToString() + ");";dic.Add(item["name"].ToString(), url);}else{dic.Add(item["name"].ToString(), getClass(id,item["name"].ToString()));}}}return dic;}///<summary>///获取文章的类别和ID,由于无限级联///返回值为泛型集合///</summary>///<returns>可以嵌套自身的泛型集合</returns>public Dictionary<string ,object> getAllClass(){return getClassBySiteId(-1);}///<summary>///根据类别id返回子类别相关信息///</summary>///<param name="id">所要查询的类别Id</param>///<param name="name">Id对应的名称</param>///<returns>装载的子类别相关类别信息</returns>public Dictionary<string, object> getClass(int id,string name){Dictionary<string, object> dic = null;string sql = "select id,[name],url from ConntentClass where parentid =@id";DataSet ds = JIZHI.DBHelper.JIZHIDBHelper.CreateInstance().Query(sql, new SqlParameter[] { new SqlParameter("@id", id) });if (ds != null){dic = new Dictionary<string, object>();foreach (DataRow item in ds.Tables[0].Select()){int classid = Convert.ToInt32(item["id"]);Dictionary<string, object>dic1=getClass(classid,item["name"].ToString());if (dic1 == null){//string value = "url:" + item["id"].ToString();// string url = "index.html";\string url = "javascript:TreeToshow("+ item["id"].ToString() + ");";dic.Add(item["name"].ToString(), url);}else{dic.Add(item["name"].ToString(), dic1);}}}return dic;}}}UI层先关代码:using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using WebCaptureDAL;using System.Collections.Generic;namespace WebCaptureUI.WebPageCommon{public class ShowTreeView{private static ShowTreeView stv = null;private ShowTreeView() { }private static Object obj = new Object();public static ShowTreeView CreateInstance(){if (stv == null){lock (obj)return stv = new ShowTreeView();}}else{return stv;}}public void getView(TreeView treeview){treeview.LineImagesFolder = "~/TreePic";Dictionary<string, object> dic = ConentClassDal.CreateInstance().getClass();treeview.Nodes.Clear();List<string> list = dic.Keys.ToList<string>();for (int i = 0; i < list.Count; i++){Dictionary<string, object> dic0 = dic[list[i]] as Dictionary<string, object>;string url = dic[list[i]] as string;if (dic0 != null){treeview.Nodes.Add(getNode0(dic0, list[i]));}else if (url != null){TreeNode node1 = new TreeNode(list[i]);node1.SelectAction = TreeNodeSelectAction.Expand;node1.NavigateUrl = url;treeview.Nodes.Add(node1);}}}public TreeNode getNode0(Dictionary<string, object> dic, string name){TreeNode node0 = new TreeNode(name);node0.SelectAction = TreeNodeSelectAction.Expand;node0.NavigateUrl = "";List<string> list = dic.Keys.ToList<string>();for (int i = 0; i < list.Count; i++){TreeNode node1 = null;string dics0 = dic[list[i]] as string;Dictionary<string, object> dics1= dic[list[i]] as Dictionary<string, object>;if (dics0 != null)node1 = new TreeNode(list[i]);node1.NavigateUrl = dics0;}else if (dics1 != null){node1 = getNode0(dics1, list[i]);node1.SelectAction = TreeNodeSelectAction.Expand;node1.NavigateUrl = "";}if (node1 != null){node0.ChildNodes.Add(node1);}}return node0;}}}。
C#TreeView从数据库绑定数据
C#TreeView从数据库绑定数据封装成一个函数,方便直接调用[csharp] view plain copyprint?1.//绑定TrreView2.private void InitModuleTree(DataTable dt)3.{4.//清空treeview上所有节点5.this.tree_Role.Nodes.Clear();6.int[] gen = new int[dt.Rows.Count]; //用于存储父节点Tag7.int[] zi = new int[dt.Rows.Count]; //用于存储子节点Tag8.for (int i = 0; i < gen.Length; i++)9.{10.string zhi=dt.Rows[i][3].ToString();//获取节点Tag值 eg:1-211.if (zhi.Length>1) //表示是子节点 eg:1-212.{13.gen[i] = int.Parse(zhi.Substring(0, zhi.IndexOf('-')));14.zi[i] = int.Parse(zhi.Substring(zhi.IndexOf('-') + 1));15.}16.else //表示是根节点 eg:217.{18.//将所有父节点加到treeview上19.zi[i] =int.Parse(zhi);20.TreeNode nodeParent = new TreeNode();21.nodeParent.Tag = (zi[i]).ToString();22.nodeParent.Text = dt.Rows[i][1].T oString();23.tree_Role.Nodes.Add(nodeParent);24.}26.bindChildNote(dt,gen,zi);27.}[csharp] view plain copyprint?1.//绑定子节点2.private void bindChildNote(DataTable dt, int[] gen, int[] zi )3.{4.for (int i = 0; i < gen.Length; i++)5.{6.if (gen[i] != 0 && zi[i] != 0) //便利所有节点,找到所有子节点7.{8.TreeNode childNode = new TreeNode();9.foreach (TreeNode item in tree_Role.Nodes) //便历treeview上所有父节点10.{11.if (item.Tag.T oString() == gen[i].T oString()) //找到当前子节点的父节点12.{13.childNode.Tag = zi[i].ToString();14.childNode.Text = dt.Rows[i][1].T oString();15.item.Nodes.Add(childNode);16.}17.}18.}19.}20.tree_Role.ExpandAll(); //展开整棵树数据库结构:最终结果:引用代码:[csharp] view plain copyprint?space TreeeeeeeeeeeView2.{3.public partial class Treeeeeeeeeee : Form4.{5.public Treeeeeeeeeee()6.{7.InitializeComponent();8.9.//从数据库获取数据,得到结果为DataT able10.SystemManager.Dao.RolePower dao = new SystemMa nager.Dao.RolePower();11.DataSet ds = pressUtil.DeCompr ess(dao.getSystemModule());12.DataTable dt = ds.Tables[0];13.InitModuleTree(dt);14.}15.16.//绑定TrreView17.private void InitModuleTree(DataTable dt)18.{19.//清空treeview上所有节点20.this.tree_Role.Nodes.Clear();21.int[] gen = new int[dt.Rows.Count]; //用于存储父节点Tag22.int[] zi = new int[dt.Rows.Count]; //用于存储子节点Tag23.for (int i = 0; i < gen.Length; i++)24.{25.string zhi=dt.Rows[i][3].ToString();//获取节点Tag值 eg:1-226.if (zhi.Length>1) //表示是子节点 eg:1-227.{28.gen[i] = int.Parse(zhi.Substring(0, zhi.IndexOf('-')));29.zi[i] = int.Parse(zhi.Substring(zhi.IndexOf('-') + 1));30.}31.else //表示是根节点 eg:232.{33.//将所有父节点加到treeview上34.zi[i] =int.Parse(zhi);35.TreeNode nodeParent = new TreeNode();36.nodeParent.Tag = (zi[i]).ToString();37.nodeParent.Text = dt.Rows[i][1].T oString();38.tree_Role.Nodes.Add(nodeParent);39.}40.}41.bindChildNote(dt,gen,zi);42.}43.44.//绑定子节点45.private void bindChildNote(DataTable dt, int[] gen, int[ ] zi)46.{47.for (int i = 0; i < gen.Length; i++)48.{49.if (gen[i] != 0 && zi[i] != 0) //便利所有节点,找到所有子节点50.{51.TreeNode childNode = new TreeNode();52.foreach (TreeNode item in tree_Role.Nodes) //便历treeview上所有父节点53.{54.if (item.Tag.T oString() == gen[i].T oString()) //找到当前子节点的父节点55.{56.childNode.Tag = zi[i].ToString();57.childNode.Text = dt.Rows[i][1].T oString();58.item.Nodes.Add(childNode);59.}60.}61.}62.}63.tree_Role.ExpandAll(); //展开整棵树64.}65.66.}67.}。
在Delphi中如何使数据库和TreeView建立联接
$%&&’(&) 组 件 是 用 于 显 示 中 ! 以上 几 种 分 析 方 法 有 着 不 同 的 适 用 范 围 ! 因此经常被综 合 运 用 & 其 中 关 联 规 则 作 为 一 种 非 常 有 用的模式 ! 已成为数据挖掘领域的重要课题 &
口 ! 节点是文 档 中 的 标 题 " 索 引 中 的 实 体 或 磁 盘 上 的 文 的块都遍历结束 后 ! 再 从 头 开 始 重 复 执 行 算 法 ! 直 到 所 有的数据项 集 的 出 现 次 数 都 已 经 被 确 定 & 经 过 有 限 次 遍历 ! 算法能得到数据项频集的集合 & 如果块的大小选 择的合适 !ABC 算法的遍历次数比 /6%(7%( 要小 & E(3 &5 +1; 于 8GGH 年 提 出 了 =(39&%I4&+%9. 算 法 ! 主 要的目的在于有效的推 导 出 较 长 的 关 联 规 则 & =(39&%I 4&+%9. 算 法 的 主 要 处 理 方 法 采 取 了 由 下 而 上 和 由 上 而 下的双向搜 寻 机 制 ! 先 利 用 由 上 而 下 的 搜 寻 方 式 将 所 有的数据项 组 成 一 个 最 大 的 候 选 数 据 项 集 ! 再 根 据 定 理 %J8K 数据项频集的所有子集合也 必 为 数 据 项 频 集 ’L!K 最大候选数 据 项 集 中 若 有 非 数 据 项 频 集 ! 则 必 为 非 数 据项频集 & 结 合 由 上 向 下 和 由 下 向 上 的 两 种 搜 索 方 向 同时向中心点搜 寻 ! 因 此 可 以 减 少 搜 寻 的 次 数 ! 很 快 地 找出所有的 数 据 项 频 集 ! 从 而 能 够 有 效 的 提 升 处 理 的 效率 &
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用TreeView绑定SQL数据源
这里采用了在页面一loading就把数据绑到TreeView的各节点的方式,而不是在展开时再作子节点的绑定,因此在点击父节点时就不会有刷新的感觉了。
呵呵,代码并没优化.......
aspx页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/1999/xhtml" >
<head runat="server">
<title>树形节点绑定</title>
</head>
<body>
<form id="form1" runat="server">
<asp:TreeView ID="TreeView1" runat="server">
</asp:TreeView>
</form>
</body>
</html>
.cs文件:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindTree();
}
}
public void BindTree()
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CreativeConnectionString"].Connectio
SqlDataAdapter sda = new SqlDataAdapter("select * from Province", con);
DataSet ds = new DataSet();
sda.Fill(ds, "Province");
TreeNode parentnode;
TreeNode childnode;
TreeNode townnode;
//TreeView1.ShowLines = true;
foreach (DataRow parentrow in ds.Tables["Province"].Rows)
{
//绑定第一层节点
parentnode = new TreeNode(parentrow["ProvinceName"].ToString(), parentrow["ProvinceId"].ToString(), "Images/shareddocuments.gif");
//运行时候先不展开子节点
parentnode.Expanded = false;
TreeView1.Nodes.Add(parentnode);
SqlDataAdapter adapter = new SqlDataAdapter("select * from City where ProvinceId =" + parentrow["ProvinceId"].ToString(), con);
adapter.Fill(ds, "City");
if (ds.Tables["City"].Rows.Count > 0)
{
//绑定第二层节点
foreach (DataRow childrow in ds.Tables["City"].Rows)
{
childnode = new TreeNode(childrow["CityName"].ToString(), childrow["CityId"].ToString(), "Images/dot.gif");
parentnode.ChildNodes.Add(childnode);
SqlDataAdapter adapter2 = new SqlDataAdapter("select townname from town where cityid=" + childrow["CityId"].ToString(),con);
adapter2.Fill(ds, "Town");
childnode.Expanded = false;
if (ds.Tables["Town"].Rows.Count > 0)
{
//绑定第三层节点
foreach (DataRow townrow in ds.Tables["Town"].Rows)
{
townnode = new TreeNode(townrow["townname"].ToString(), townrow["townname"].ToString(), "Images/log.gif");
childnode.ChildNodes.Add(townnode);
} ds.Tables["Town"].Clear();
}
}
ds.Tables["City"].Clear();
}
con.Close();
}
}
建立如下关系
1,Province
ProvinceID int 主键自增ProvinceName varchar(50) 2,City
CityID int 主键自增ProvinceID int 外键CityName varchar(50) 3,Town
Townid int 主键自增Townname varchar(50) Cityid int 外键。