WinForm中TreeView如何绑定数据库?? ID NAME PARENTID1 电器 02 电视机 13 洗衣机 14 冰箱 1想实现的树是电器|----电视机----洗衣机----冰箱 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.cnblogs.com/xiang/archive/2006/07/13/449944.aspx 用递归DataSet ds=new DataSet(); private void Form1_Load(object sender, System.EventArgs e) { // 定义数据库连接 SqlConnection CN = new SqlConnection(); try { //初始化连接字符串 CN.ConnectionString= "data source=pmserver;initial catalog=Bench; persist security info=False;user id=sa;Password=sa;"; CN.Open(); //添加命令,从数据库中得到数据 SqlCommand sqlCmd= new SqlCommand(); sqlCmd.Connection = CN; sqlCmd.CommandText = "select * from tbTree"; sqlCmd.CommandType = CommandType.Text ; SqlDataAdapter adp = new SqlDataAdapter(sqlCmd); adp.Fill(ds); } catch (Exception ex) { throw (ex); } finally { CN.Close(); } //调用递归函数,完成树形结构的生成 AddTree(0, (TreeNode)null); } // 递归添加树的节点 public void AddTree(int ParentID,TreeNode pNode) { DataView dvTree = new DataView(ds.Tables[0]); //过滤ParentID,得到当前的所有子节点 dvTree.RowFilter = "[PARENTID] = " + ParentID; foreach(DataRowView Row in dvTree) { if(pNode == null) { //'̀添加根节点 TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString()); AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归 } else { //添加当前节点的子节点 TreeNode Node = pNode.Nodes.Add(Row["ConText"].ToString()); AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归 } } } 我写出来的效果是+电器---电器+电视机---电视机+洗衣机---洗衣机+冰箱---冰箱private DataTable CreateTable() { OConn.Open();//打开数据库连接 OracleDataAdapter da = new OracleDataAdapter("select * from LIST", OConn);//建立数据适配器 da.Fill(dt);//进行数据填充 return dt;//返回一个数据表dt } private void CreateTree() { DataView dv = new DataView(dt, null, "PARENTID ASC", DataViewRowState.CurrentRows); string strParentID = ""; TreeNode tnParent = null; foreach (DataRowView drv in dv) { if (strParentID != drv["PARENTID"].ToString()) { //Add parent node here strParentID = drv["NAME"].ToString(); tnParent = treeView1.Nodes.Add(strParentID); } tnParent.Nodes.Add(drv["NAME"].ToString()); } } 研究下微软的解释http://www.microsoft.com/china/community/Column/21.mspx 不难!1 : select where =0;2: 增加子接点;3: 递归增加子节点 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 { protected string _connstr = ConfigurationManager.ConnectionStrings["DemoConnectionstrings"].ConnectionString; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindTree(); using (SqlConnection _conn = new SqlConnection(_connstr)) { SqlCommand _comm = new SqlCommand("select * from treeview", _conn); _conn.Open(); using (SqlDataReader r = _comm.ExecuteReader()) { while (r.Read()) { ListItem item = new ListItem(r["txt"].ToString(), r["id"].ToString()); this._dd_parent.Items.Add(item); } } } this._dd_parent.Items.Insert(0, new ListItem(".", "0")); } } protected void BindTree() { TreeNode node = new TreeNode(); //这里是创建一个根节点,就是dome中看到的Root node.Text = "Root"; CreateChildTree(node, 0); _tree_view.Nodes.Add(node); } protected void CreateChildTree(TreeNode _parentNode, int _parentID) { using (SqlConnection _conn = new SqlConnection(_connstr)) { SqlCommand _comm = new SqlCommand(); string sql = "select * from treeview where rootid=@rootid"; _comm.Parameters.Add("@rootid", SqlDbType.Int).Value = _parentID; _comm.CommandText = sql; _comm.Connection = _conn; _conn.Open(); using (SqlDataReader r = _comm.ExecuteReader()) { while (r.Read()) { TreeNode _node = new TreeNode(r["txt"].ToString()); CreateChildTree(_node, (int)r["ID"]); //递归出子节点 _parentNode.ChildNodes.Add(_node); } } } } protected void _btn_submit_Click(object sender, EventArgs e) { int _rootid = Convert.ToInt16(this._dd_parent.SelectedValue); string _txt = this._txt_txt.Text.Trim(); using (SqlConnection _conn = new SqlConnection(_connstr)) { SqlCommand _comm = new SqlCommand("insert into treeview (txt,rootid) values (@txt,@id)", _conn); _comm.Parameters.Add("@txt", SqlDbType.VarChar, 50).Value = _txt; _comm.Parameters.Add("@id", SqlDbType.Int).Value = _rootid; _conn.Open(); _comm.ExecuteNonQuery(); } this._tree_view.Nodes.Clear(); BindTree(); } } 想实现的树是电器|----电视机----洗衣机----冰箱但我写出来的效果是+电器---电器+电视机---电视机+洗衣机---洗衣机+冰箱---冰箱private DataTable CreateTable() { OConn.Open();//打开数据库连接 OracleDataAdapter da = new OracleDataAdapter("select * from LIST", OConn);//建立数据适配器 da.Fill(dt);//进行数据填充 return dt;//返回一个数据表dt } private void CreateTree() { DataView dv = new DataView(dt, null, "PARENTID ASC", DataViewRowState.CurrentRows); string strParentID = ""; TreeNode tnParent = null; foreach (DataRowView drv in dv) { if (strParentID != drv["PARENTID"].ToString()) { //Add parent node here strParentID = drv["NAME"].ToString(); tnParent = treeView1.Nodes.Add(strParentID); } tnParent.Nodes.Add(drv["NAME"].ToString()); } }-------------------------------------能不能在这个上面修改一下. 我要的是winform.别再给我web的了 win如何把树与数据库的信息进行绑定http://blog.csdn.net/knight94/archive/2006/05/01/704281.aspx Knight94(愚翁)我看了你写的,也按照你写的方式写了.但读取出来只有一个跟父结点private DataTable CreateTable() { try { OConn.Open();//打开数据库连接 OracleDataAdapter da = new OracleDataAdapter("select * from Mytable",OConn);//建立数据适配器 da.Fill(dt);//进行数据填充 return dt;//返回一个数据表dt }catch(Exception ex) { throw(ex); }finally { OConn.Close(); } } private void CreateTree() { DataRow[] drArray = dt.Select("ParentID=0", "ParentID ASC", DataViewRowState.CurrentRows); if (drArray.Length == 0) return; TreeNode tnNew = null; foreach (DataRow dr in drArray) { tnNew = treeView1.Nodes.Add(dr["NAME"].ToString()); tnNew.Tag = dr["ID"].ToString();//Save "EmployeeID" in node's tag CreateTreeNode(ref tnNew); } } private void CreateTreeNode(ref TreeNode tnParent) { //Get children data info DataRow[] drArray = dt.Select( string.Format("ParentID = {0}", tnParent.Tag), "ParentID ASC", DataViewRowState.CurrentRows); if (drArray.Length == 0) return; TreeNode tnNew = null; foreach (DataRow dr in drArray) { tnNew = tnParent.Nodes.Add(dr["NAME"].ToString()); tnNew.Tag = dr["ID"].ToString();//Save "EmployeeID" in node's tag CreateTreeNode(ref tnNew); } }请指教 ID NAME PARENTID1 电器 02 电视机 13 洗衣机 14 冰箱 1连接字符串OracleConnection OConn = new OracleConnection("User Id=MyID;PassWord=MyPass;Data Source=192.168.2.1:1521/MyData;");这个是表结构.是不是我在填充数据的时候出了错? 现在有成型的例子了么?有的话发一份,我正在研究[email protected] 谢谢 这就很怪了,你单步调试,看看dt.Select后的结果是什么 递归就是速度慢了。一个只有48条记录的表,生成3级的树竞要花2、3秒左右当然我是直接在库里读的。如果先放到dataTable里可能会好些? 奇怪。为什么呢?应该是填充Dataset的时候出了问题 强烈建议兄弟们自己写xmlTreeView组件目前我写好的基本上能满足你的要求,但还有BUG我在:http://community.csdn.net/Expert/topic/5096/5096131.xml?temp=.3367731#top也建议用自己写组件,不过大多数人还是没理解XML带来的好处 XML是挺好的.只是好象用的人还不是那么多 我相信来CSDN的 朋友们,可以说,,,至少有一半以上不懂的,,这个朋友,也是关于无限级分类的,都是说的比较模糊的...看下我的帖子,还有好多类似我的帖子,,都是没真正了解的!都是模糊概念http://community.csdn.net/Expert/topic/5158/5158852.xml?temp=.7078668http://community.csdn.net/Expert/topic/5158/5158877.xml?temp=.5437586我帖子上面2个朋友发出来了那2部分代码确实不错!可以实现,但是我是真的怎么调都没成功......或许是我不行吧....但是我会认真对待的....没有详细的理解,,,,象我一样只是了解表面而已!!!我可以说楼主,,到目前为止还是没有懂无限分类的真正的用法.没有真正的理解叫程序员???说实在的,我搞不懂之前,,我会在这里一直等下去的!!! 我写的XmlTreeView for WinForm已经完成,就是在节点增至3000个以上时再增加一节点要化0.5秒左右,有点慢,节点的级数和int一样多(当然我也可改成long int) MailMessage发送邮件 多个数据库访问的问题 关于主线程窗体隐藏的问题 C#操作打印机 求一段代码 系统即将关闭时winform 整个application关闭form后同时关闭所有线程,使其彻底退出内存 help!关于串口程序 有一段WPF程序,想通过winform表现出来,求教 “Socket”发送数据的疑问? 请问为何不能打印报表的全部内容? 新手提问 简单问题关于winfrom .net编程如何控制windows服务?
private void Form1_Load(object sender, System.EventArgs e)
{
// 定义数据库连接
SqlConnection CN = new SqlConnection();
try
{
//初始化连接字符串
CN.ConnectionString=
"data source=pmserver;initial catalog=Bench;
persist security info=False;user id=sa;Password=sa;";
CN.Open();
//添加命令,从数据库中得到数据
SqlCommand sqlCmd= new SqlCommand();
sqlCmd.Connection = CN;
sqlCmd.CommandText = "select * from tbTree";
sqlCmd.CommandType = CommandType.Text ;
SqlDataAdapter adp = new SqlDataAdapter(sqlCmd);
adp.Fill(ds);
}
catch (Exception ex)
{
throw (ex);
}
finally
{
CN.Close();
}
//调用递归函数,完成树形结构的生成
AddTree(0, (TreeNode)null);
} // 递归添加树的节点
public void AddTree(int ParentID,TreeNode pNode)
{
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[PARENTID] = " + ParentID;
foreach(DataRowView Row in dvTree)
{
if(pNode == null)
{ //'̀添加根节点
TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
else
{ //添加当前节点的子节点
TreeNode Node = pNode.Nodes.Add(Row["ConText"].ToString());
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
}
}
---电器
+电视机
---电视机
+洗衣机
---洗衣机
+冰箱
---冰箱
private DataTable CreateTable()
{
OConn.Open();//打开数据库连接
OracleDataAdapter da = new OracleDataAdapter("select * from LIST", OConn);//建立数据适配器
da.Fill(dt);//进行数据填充
return dt;//返回一个数据表dt
} private void CreateTree()
{
DataView dv = new DataView(dt, null, "PARENTID ASC", DataViewRowState.CurrentRows);
string strParentID = "";
TreeNode tnParent = null;
foreach (DataRowView drv in dv)
{
if (strParentID != drv["PARENTID"].ToString())
{
//Add parent node here
strParentID = drv["NAME"].ToString();
tnParent = treeView1.Nodes.Add(strParentID);
}
tnParent.Nodes.Add(drv["NAME"].ToString());
}
}
http://www.microsoft.com/china/community/Column/21.mspx
1 : select where =0;2: 增加子接点;3: 递归增加子节点
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
{
protected string _connstr = ConfigurationManager.ConnectionStrings["DemoConnectionstrings"].ConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindTree();
using (SqlConnection _conn = new SqlConnection(_connstr))
{
SqlCommand _comm = new SqlCommand("select * from treeview", _conn); _conn.Open();
using (SqlDataReader r = _comm.ExecuteReader())
{
while (r.Read())
{
ListItem item = new ListItem(r["txt"].ToString(), r["id"].ToString());
this._dd_parent.Items.Add(item);
}
}
}
this._dd_parent.Items.Insert(0, new ListItem(".", "0"));
}
}
protected void BindTree()
{
TreeNode node = new TreeNode(); //这里是创建一个根节点,就是dome中看到的Root
node.Text = "Root";
CreateChildTree(node, 0);
_tree_view.Nodes.Add(node);
} protected void CreateChildTree(TreeNode _parentNode, int _parentID)
{
using (SqlConnection _conn = new SqlConnection(_connstr))
{
SqlCommand _comm = new SqlCommand();
string sql = "select * from treeview where rootid=@rootid";
_comm.Parameters.Add("@rootid", SqlDbType.Int).Value = _parentID;
_comm.CommandText = sql;
_comm.Connection = _conn;
_conn.Open();
using (SqlDataReader r = _comm.ExecuteReader())
{
while (r.Read())
{
TreeNode _node = new TreeNode(r["txt"].ToString());
CreateChildTree(_node, (int)r["ID"]); //递归出子节点
_parentNode.ChildNodes.Add(_node);
}
}
}
}
protected void _btn_submit_Click(object sender, EventArgs e)
{
int _rootid = Convert.ToInt16(this._dd_parent.SelectedValue);
string _txt = this._txt_txt.Text.Trim();
using (SqlConnection _conn = new SqlConnection(_connstr))
{
SqlCommand _comm = new SqlCommand("insert into treeview (txt,rootid) values (@txt,@id)", _conn);
_comm.Parameters.Add("@txt", SqlDbType.VarChar, 50).Value = _txt;
_comm.Parameters.Add("@id", SqlDbType.Int).Value = _rootid;
_conn.Open();
_comm.ExecuteNonQuery();
}
this._tree_view.Nodes.Clear();
BindTree();
}
}
|
----电视机
----洗衣机
----冰箱但我写出来的效果是+电器
---电器
+电视机
---电视机
+洗衣机
---洗衣机
+冰箱
---冰箱
private DataTable CreateTable()
{
OConn.Open();//打开数据库连接
OracleDataAdapter da = new OracleDataAdapter("select * from LIST", OConn);//建立数据适配器
da.Fill(dt);//进行数据填充
return dt;//返回一个数据表dt
} private void CreateTree()
{
DataView dv = new DataView(dt, null, "PARENTID ASC", DataViewRowState.CurrentRows);
string strParentID = "";
TreeNode tnParent = null;
foreach (DataRowView drv in dv)
{
if (strParentID != drv["PARENTID"].ToString())
{
//Add parent node here
strParentID = drv["NAME"].ToString();
tnParent = treeView1.Nodes.Add(strParentID);
}
tnParent.Nodes.Add(drv["NAME"].ToString());
}
}
-------------------------------------
能不能在这个上面修改一下.
如何把树与数据库的信息进行绑定
http://blog.csdn.net/knight94/archive/2006/05/01/704281.aspx
{
try
{
OConn.Open();//打开数据库连接
OracleDataAdapter da = new OracleDataAdapter("select * from Mytable",OConn);//建立数据适配器
da.Fill(dt);//进行数据填充
return dt;//返回一个数据表dt
}catch(Exception ex)
{
throw(ex);
}finally
{
OConn.Close();
}
}
private void CreateTree()
{ DataRow[] drArray = dt.Select("ParentID=0", "ParentID ASC", DataViewRowState.CurrentRows); if (drArray.Length == 0) return; TreeNode tnNew = null; foreach (DataRow dr in drArray)
{ tnNew = treeView1.Nodes.Add(dr["NAME"].ToString()); tnNew.Tag = dr["ID"].ToString();//Save "EmployeeID" in node's tag CreateTreeNode(ref tnNew); } } private void CreateTreeNode(ref TreeNode tnParent)
{ //Get children data info DataRow[] drArray = dt.Select( string.Format("ParentID = {0}", tnParent.Tag), "ParentID ASC", DataViewRowState.CurrentRows); if (drArray.Length == 0) return; TreeNode tnNew = null; foreach (DataRow dr in drArray)
{ tnNew = tnParent.Nodes.Add(dr["NAME"].ToString()); tnNew.Tag = dr["ID"].ToString();//Save "EmployeeID" in node's tag CreateTreeNode(ref tnNew); } }请指教
1 电器 0
2 电视机 1
3 洗衣机 1
4 冰箱 1连接字符串
OracleConnection OConn = new OracleConnection("User Id=MyID;PassWord=MyPass;Data Source=192.168.2.1:1521/MyData;");
这个是表结构.是不是我在填充数据的时候出了错?
[email protected] 谢谢
当然我是直接在库里读的。如果先放到dataTable里可能会好些?
目前我写好的基本上能满足你的要求,但还有BUG
我在:http://community.csdn.net/Expert/topic/5096/5096131.xml?temp=.3367731#top
也建议用自己写组件,不过大多数人还是没理解XML带来的好处
至少有一半以上不懂的,,
这个朋友,也是关于无限级分类的,都是说的比较模糊的...
看下我的帖子,还有好多类似我的帖子,,都是没真正了解的!都是模糊概念
http://community.csdn.net/Expert/topic/5158/5158852.xml?temp=.7078668
http://community.csdn.net/Expert/topic/5158/5158877.xml?temp=.5437586我帖子上面2个朋友发出来了那2部分代码确实不错!
可以实现,但是我是真的怎么调都没成功......或许是我不行吧....但是我会认真对待的
....没有详细的理解,,,,象我一样只是了解表面而已!!!我可以说楼主,,到目前为止还是没有懂无限分类的真正的用法.没有真正的理解叫程序员???说实在的,我搞不懂之前,,我会在这里一直等下去的!!!