TreeView

WINFORM界面如下:
TreeView

本文用了2张表,结构如下:
表province: province_id province_name
表city: city_id city_name province_id
TreeView
完整代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;

namespacetest
{
publicpartialclassTreeStruc:Form
{
publicTreeStruc()
{
InitializeComponent();
}

SqlConnectionconn
=newSqlConnection("server=zhuzy;integratedsecurity=sspi;database=library");
SqlDataAdapterda;
DataSetds
=newDataSet();
SqlCommandcmd;
///<summary>
///自定义节点类,继承于系统的TreeNode类,给节点增加一个IsFirstExpand属性
///</summary>
publicclassInheritTreeNode:TreeNode
{
privateboolisFirstExpand=true;

publicboolIsFirstExpand//属性
{
get{returnisFirstExpand;}
set{isFirstExpand=value;}
}

publicInheritTreeNode():base(){}
publicInheritTreeNode(stringtext):base(text){}
}

stringid="";
privatevoidTreeStruc_Load(objectsender,EventArgse)
{
da
=newSqlDataAdapter("selectprovince_id,province_namefromprovince",conn);
da.Fill(ds,
"province");
for(inti=0;i<ds.Tables["province"].Rows.Count;i++)
{
InheritTreeNoderoot
=newInheritTreeNode(ds.Tables["province"].Rows[i][1].ToString().Trim());
id
=ds.Tables["province"].Rows[i][0].ToString().Trim();
this.treeView1.Nodes.Add(root);
ReadChileNode(root);
id
="";//
}
this.treeView1.SelectedNode=treeView1.Nodes[0];
}

///<summary>
///读取node的子节点
///</summary>
privatevoidReadChileNode(TreeNodenode)
{
da
=newSqlDataAdapter("selectcity_namefromcitywhereprovince_id='"+id+"'",conn);
da.Fill(ds,
"city");
try
{
for(intj=0;j<ds.Tables["city"].Rows.Count;j++)
{
node.Nodes.Add(
newInheritTreeNode(ds.Tables["city"].Rows[j][0].ToString().Trim()));
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
ds.Tables[
"city"].Clear();//
}

///<summary>
///节点展开之前事件
///</summary>
privatevoidtreeView1_BeforeExpand(objectsender,TreeViewCancelEventArgse)
{
InheritTreeNodenode
=(InheritTreeNode)e.Node;//获取要选中、展开、折叠或选择的树节点e.Node

if(node!=null)
{
//判断该节点是否首次被展开
if(node.IsFirstExpand)
{
for(inti=0;i<node.Nodes.Count;i++)
{
ReadChileNode(node.Nodes[i]);
//为e.Node下的每个子节点,添加子节点
}
}
}
node.IsFirstExpand
=false;
}

///<summary>
///将文本框输入的内容添加为父节点
///</summary>
privatevoidbtnAddParentNode_Click(objectsender,EventArgse)
{
try
{
stringstrParentNode=this.textBox1.Text.ToString().Trim();
da
=newSqlDataAdapter("selectprovince_namefromprovincewhereprovince_name='"+strParentNode+"'",conn);
da.Fill(ds,
"province_name");
intnCount=ds.Tables["province_name"].Rows.Count;
if(textBox1.Text.ToString().Trim()!="")
{
if(nCount==0)//判断是否存在重复省份
{
da
=newSqlDataAdapter("selectmax(province_id)fromprovince",conn);
da.Fill(ds,
"id");

string_max_province_id=ds.Tables["id"].Rows[0][0].ToString().Trim();
intnID=Convert.ToInt32(_max_province_id)+1;
stringstrID="00"+nID.ToString().Trim();

string_insertSQL="insertintoprovincevalues('"+strID+"','"+strParentNode+"')";
cmd
=newSqlCommand(_insertSQL,conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

this.treeView1.Nodes.Add(strParentNode);//使新增的节点在TreeView里显示
textBox1.Clear();
textBox1.Focus();
}
else
{
MessageBox.Show(
"当前新增的省份已经存在,请重新输入!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
textBox1.Clear();
textBox1.Focus();
}
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}

///<summary>
///在选择了父节点后,将文本框中的内容添加为其子节点
///</summary>
stringstr_insert_province_id="";
stringstr_insert_city_id="";
privatevoidbtnAddChildNode_Click(objectsender,EventArgse)
{
try
{
TreeNodenode
=this.treeView1.SelectedNode;
stringstrProvinceName=node.Text;
if(node!=null)
{
retunParentNode_ID(strProvinceName);
insertChildNode(node);
textBox1.Clear();
textBox1.Focus();
}
else
{
MessageBox.Show(
"请先选择需要新增城市信息的省份!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
textBox1.Clear();
textBox1.Focus();
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}

///<summary>
///返回当前选择的父节点的province_id
///</summary>
///<returns></returns>
privatestringretunParentNode_ID(stringstrName)
{
da
=newSqlDataAdapter("selectprovince_idfromprovincewhereprovince_name='"+strName+"'",conn);
da.Fill(ds,
"province_id");
str_insert_province_id
=ds.Tables["province_id"].Rows[0][0].ToString().Trim();//即将新增的子节点的province_id
returnstr_insert_province_id;
}
///<summary>
///在当前选择的父节点下新增子节点
///</summary>
privatevoidinsertChildNode(TreeNodeCurrentParentNode)
{
stringstrChildNode=this.textBox1.Text.ToString().Trim();
try
{
if(textBox1.Text.ToString().Trim()!="")
{
stringstrsql="select*fromcitywhereprovince_id='"+str_insert_province_id+"'";
da
=newSqlDataAdapter(strsql,conn);
da.Fill(ds,
"tb");
intnCount1=ds.Tables["tb"].Rows.Count;
if(nCount1==0)//父节点下没有子节点
{
string_city_id="0"+"1";
string_insertSQL="insertintocityvalues('"+_city_id+"','"+strChildNode+"','"+str_insert_province_id+"')";

cmd
=newSqlCommand(_insertSQL,conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

CurrentParentNode.Nodes.Add(strChildNode);
textBox1.Clear();
textBox1.Focus();
}
if(nCount1!=0)//父节点下有子节点
{
da
=newSqlDataAdapter("selectcity_namefromcitywherecity_name='"+strChildNode+"'",conn);
da.Fill(ds,
"city_name");
intnCount2=ds.Tables["city_name"].Rows.Count;
if(nCount2==0)//不存在相同的子节点
{
string_max_city_id="selectmax(city_id)fromcitywhereprovince_id='"+str_insert_province_id+"'";
da
=newSqlDataAdapter(_max_city_id,conn);
da.Fill(ds,
"city_id");
str_insert_city_id
=ds.Tables["city_id"].Rows[0][0].ToString().Trim();
intnID=Convert.ToInt32(str_insert_city_id)+1;
str_insert_city_id
="0"+nID.ToString().Trim();

string_insertSQL="insertintocityvalues('"+str_insert_city_id+"','"+strChildNode+"','"+str_insert_province_id+"')";

cmd
=newSqlCommand(_insertSQL,conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

CurrentParentNode.Nodes.Add(strChildNode);
textBox1.Clear();
textBox1.Focus();
}
if(nCount2!=0)//存在相同的子节点
{
MessageBox.Show(
"已经存在此城市,请重新输入!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
textBox1.Clear();
textBox1.Focus();
}
}
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
}
}

备注:此树只实现2层结构