因为项目里需要在ComboBox里的下拉框里填充树状的选择项,我个人感觉最好还可以做到子结点的伸缩,因此颇费了一些功夫,现在大体做了个总结。
1。第一考虑的是下载现成的控件。
网上找了几个:
1)http://www.codeproject.com/cs/miscctrl/customcombos.asp
2)http://www.codetools.com/cs/miscctrl/ComboBoxTree.asp
第一个不好用,第2个可以用,不过总有问题。每次你在加载了ComboBoxTree的页面添加或修改别的控件后,运行就报错,需要在初始化函数里把一个值人工改为空。而且这个控件只能把每项的name的string值呈现树形,而不能把每个ITEM的text和value一一对应,总之用的不顺手,就放弃了。
test
#region test
/**//// <summary>
/// 获取部门列表
/// </summary>
private void getDeptItem()
...{
PoliceArchives.DbConnect.DBAccess selectDeptDBAccess = new PoliceArchives.DbConnect.DBAccess();
string sqlStr = "SELECT * from dept_tab";
selectDeptDBAccess.SelectDataSetCommand= sqlStr;
selectDeptDBAccess.Open();
deptDS= selectDeptDBAccess.GetDataSet;
AddTree(0,(TreeNode)null);
for(int i=0;i<DeptDS.Tables[0].Rows.Count;i++)
...{
if(DeptDS.Tables[0].Rows[i]["dept_prt_no"].ToString()=="")
...{
this.comboBoxTree1.Nodes.Add(DeptDS.Tables[0].Rows[i]["dept_name"].ToString());
}
}
}
// 递归添加树的节点
public void AddTree(int ParentID,TreeNode pNode)
...{
DataView dvTree = new DataView(deptDS.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[dept_prt_no] = " + ParentID;
foreach(DataRowView Row in dvTree)
...{
if(pNode == null)
...{ //'?添加根节点
TreeNode Node = this.comboBoxTree1.Nodes.Add(Row["dept_name"].ToString());
AddTree(Int32.Parse(Row["dept_no"].ToString()),Node); //再次递归
}
else
...{ //添加当前节点的子节点
TreeNode Node = pNode.Nodes.Add(Row["dept_name"].ToString());
AddTree(Int32.Parse(Row["dept_no"].ToString()),Node); //再次递归
}
}
}
#endregion
/**//// <summary>
/// 获取部门列表
/// </summary>
private void getDeptItem()
...{
PoliceArchives.DbConnect.DBAccess selectDeptDBAccess = new PoliceArchives.DbConnect.DBAccess();
string sqlStr = "SELECT * from dept_tab";
selectDeptDBAccess.SelectDataSetCommand= sqlStr;
selectDeptDBAccess.Open();
deptDS= selectDeptDBAccess.GetDataSet;
AddTree(0,(TreeNode)null);
for(int i=0;i<DeptDS.Tables[0].Rows.Count;i++)
...{
if(DeptDS.Tables[0].Rows[i]["dept_prt_no"].ToString()=="")
...{
this.comboBoxTree1.Nodes.Add(DeptDS.Tables[0].Rows[i]["dept_name"].ToString());
}
}
}
// 递归添加树的节点
public void AddTree(int ParentID,TreeNode pNode)
...{
DataView dvTree = new DataView(deptDS.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "[dept_prt_no] = " + ParentID;
foreach(DataRowView Row in dvTree)
...{
if(pNode == null)
...{ //'?添加根节点
TreeNode Node = this.comboBoxTree1.Nodes.Add(Row["dept_name"].ToString());
AddTree(Int32.Parse(Row["dept_no"].ToString()),Node); //再次递归
}
else
...{ //添加当前节点的子节点
TreeNode Node = pNode.Nodes.Add(Row["dept_name"].ToString());
AddTree(Int32.Parse(Row["dept_no"].ToString()),Node); //再次递归
}
}
}
#endregion
2。用treelistView,鼠标单击columnHeader,则把treeListView的高度变高,鼠标落在别的区域,则高度收缩,