现在数据库里有这么几个字段ID,HHHno(varchar(50)),HHHType(int).
其中HHHno是这样的1, 1.1, 1.1.1, 2.5.6,就是这种类型的。它表明了所有数据的父子关系。如果看不懂这句话或这个字段的含义,请不要回复此贴。
HHHType表示级别,和HHHno字段对应,
HHHno HHHType
1 1
1.1 2
1.1.1 3
2 1
2.1 2
2.1.1 3
2.1.2 3现在要把这些数据绑定到TreeView中去。求好的方法。我前面发给帖子,能够实现功能,但总感觉不好。
其中HHHno是这样的1, 1.1, 1.1.1, 2.5.6,就是这种类型的。它表明了所有数据的父子关系。如果看不懂这句话或这个字段的含义,请不要回复此贴。
HHHType表示级别,和HHHno字段对应,
HHHno HHHType
1 1
1.1 2
1.1.1 3
2 1
2.1 2
2.1.1 3
2.1.2 3现在要把这些数据绑定到TreeView中去。求好的方法。我前面发给帖子,能够实现功能,但总感觉不好。
解决方案 »
- 求高人指点,文件上传问题!?
- 删除表数据 保持表列名 但是ID更新
- 怎样打开从网上下载的Asp.net源代码?
- 求解:“System.Exception: 指定的转换无效”谢谢。
- 为什么droplist在页面中用droplist.items.add("1")加入去后在droplist_SelectedIndexChanged事情不能捉到其值.
- 如何隐藏自定义控件里面的控件?
- asp.net 怎么切图啊,问了半天没人回答阿,分都没了(就是用户上传的图片,我想切一部分阿)
- 急.求一条简单的sql查询语句.100分!!!
- 对.net不了解的人想用c sharp与asp.net开发系统?
- 一直以来有一个对于asp.net mvc areas的疑问。关于views存放地儿的。
- 怎么删除TreeView节点?
- 怎么实现 邮件杀毒啊
Table 列 为 ID(唯一),ParentId(记录父节点)下面是一个从文本文件中读取记录的方法,贴给你看一看,希望对你有所帮助
private void btnOK_Click(object sender, System.EventArgs e)
{
this.LoadStdSubj("");
} private void LoadStdSubj(string strValue)
{
string path = "StdSub.txt";
string str = "";
int length = 0 ; this.trvStdTree.Nodes[0].Nodes.Clear();
StreamReader sr = new StreamReader(path);
while ( sr.Peek() >-1 )
{
str = sr.ReadLine();
length = str.IndexOf(":",0);
string str1 = str.Substring(0,length);
string str2 = str.Substring(length+1);
//this.trvStdTree.SelectedNode = this.trvStdTree.Nodes[0];
this.FormStdTree(str1,str2);
}
sr.Close();
} private void FormStdTree(string strSubject,string strParent)
{
if( strParent == "NULL")
{
//首先选中
this.trvStdTree.SelectedNode = this.trvStdTree.Nodes[0];
TreeNode node = new TreeNode(strSubject);
this.trvStdTree.Nodes[0].Nodes.Add(node);
//this.trvStdTree.SelectedNode = node;
}
else
{
foreach(TreeNode node2 in this.trvStdTree.Nodes)
{
SelectNode(node2,strParent);
}
TreeNode node3 = new TreeNode(strSubject);
this.trvStdTree.SelectedNode.Nodes.Add(node3); }
} private void SelectNode(TreeNode treeNode,string SubjID)
{
if(treeNode.Text == SubjID)
{
treeNode.TreeView.SelectedNode = treeNode;
}
else
{
foreach(TreeNode node in treeNode.Nodes)
{
this.SelectNode(node,SubjID);
}
}
}
像这种表用递归就可以实现
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ LoadTreeNode();
}
private void LoadTreeNode()
{
string ls_conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True";
string ls_sel = "select HHHno,HHHType from Table1 order by HHHno";
TreeNode[] tNode;
string Hno = "";
int HType = 0;
tNode = new TreeNode[3]; using (SqlConnection conn = new SqlConnection(ls_conStr))
{
SqlCommand cmd = new SqlCommand(ls_sel, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())
{
Hno = dr[0].ToString();
HType = Convert.ToInt16(dr[1].ToString());
TreeNode curNode = new TreeNode(Hno, HType.ToString());
if (HType == 1)
{
//插入第一级节点
TreeView1.Nodes.Add(curNode);
}
else
{
tNode[HType - 1 - 1].ChildNodes.Add(curNode);
}
tNode[HType-1] = curNode;
}
dr.Close();
dr.Dispose();
}
}
}=======================================================
The CodeGear.cn 你身边的开发资源
go
create table tb (hno varchar(50),htype int)
insert into tb select '1',1
insert into tb select '1.1',2
insert into tb select '1.1.1',3
insert into tb select '2',1
insert into tb select '2.1',2
insert into tb select '2.1.1',3
insert into tb select '2.1.2',3
go
--删除1.1下
--delete tb where hno like'1.1%'
--插入2.1下
declare @no varchar(10),@hno varchar(20)
set @no = '2.1'
select top 1 @hno=hno from tb where hno like @no+'%' and htype=(select htype+1 from tb where hno=@no) order by hno desc
set @hno = @no+'.'+ ltrim(cast(right(@hno,charindex('.',reverse(@hno))-1) as int)+1)
insert into tb(hno,htype) select @hno,htype=(select htype+1 from tb where hno=@no)
select * from tb order by hno,htype
hno htype
1 1
1.1 2
1.1.1 3
2 1
2.1 2
2.1.1 3
2.1.2 3
2.1.3 3
这里我不写具体的,只提供参考:
这里要先写个函数FindChild,功能是返回他的所有孩子数组;
build(root){
if(root.finchild.length!=0){
for(...){
setup(root.finchild[i]);
sethischild(root,root.finchild[i]);
}
}
}setup(node){
if(node.finchild.length!=0){
for(...){
setup(node.finchild[i]);
sethischild(node,node.finchild[i]);
}
}
}
/// 将数据表中typeName字段替换成树形
/// </summary>
/// <param name="table">表名</param>
/// <returns>填充后的数据表</returns>
public DataTable getTreeDataTable(string table)
{
DataTable dtSource = new DataTable();
TreeAction a = new TreeAction();
dtSource = a.list(table);//得到列表
//a.close();
char nbsp = (char)0xA0; //空格
string strTmp = "";
string itemText, itemValue; for (int i = 0; i<= dtSource.Rows.Count - 1; i++)
{
DataRow dr=dtSource.Rows[i];
int tmpDepth = (int)dr["Depth"];
int NextID = (int)dr["NextID"];
int typeID = (int)dr["typeID"];
int child = (int)dr["child"];
string typeName = (string)dr["typeName"]; try
{
ShowLine[tmpDepth] = NextID > 0 ? true : false;//这个值是经常被修改的.
}
catch
{
ShowLine.Add(false);
ShowLine[tmpDepth] = NextID > 0 ? true : false;//这个值是经常被修改的.
} itemValue = typeID.ToString(); //值
itemText = ""; //显示内容 if (tmpDepth > 0)
{
for (int j = 1; j <= tmpDepth; j++)
{
itemText += strTmp.PadLeft(2, nbsp);
if (j == tmpDepth)
{
if (NextID > 0)
itemText += "├" + strTmp.PadLeft(1, nbsp);
else
itemText += "└" + strTmp.PadLeft(1, nbsp);
}
else
{
if ((bool)ShowLine[j])
itemText += "│";
else
itemText += strTmp.PadLeft(1, nbsp);
}
}
} itemText += typeName; dr["typeName"] = itemText; }
return dtSource;
}
-------------
CREATE TABLE tb(ID int,PID int,Name nvarchar(10))
INSERT tb SELECT 1,NULL,'山东省'
UNION ALL SELECT 2,1 ,'烟台市'
UNION ALL SELECT 4,2 ,'招远市'
UNION ALL SELECT 3,1 ,'青岛市'
UNION ALL SELECT 5,NULL,'四会市'
UNION ALL SELECT 6,5 ,'清远市'
UNION ALL SELECT 7,6 ,'小分市'
GO--节点复制处理函数
CREATE FUNCTION f_CopyNode(
@ID int, --复制此节点下的所有子节点
@PID int, --将@ID下的所有子节点复制到此节点下面
@NewID int=NULL --新编码的开始值,如果指定为NULL,则为表中的最大编码+1
)RETURNS @t TABLE(OldID int,ID int,PID int)
AS
BEGIN
IF @NewID IS NULL
SELECT @NewID=COUNT(*)+1 FROM TB
DECLARE tb CURSOR LOCAL
FOR
SELECT ID FROM tb
WHERE PID=@ID
OPEN TB
FETCH tb INTO @ID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT @t VALUES(@ID,@NewID,@PID)
SET @NewID=@NewID+1
IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
BEGIN
--递归查找当前节点的子节点
DECLARE @PID1 int
SET @PID1=@NewID-1
INSERT @t SELECT * FROM f_CopyNode(@ID,@PID1,@NewID)
SET @NewID=@NewID+@@ROWCOUNT --排序号加上子节点个数
END
FETCH tb INTO @ID
END
RETURN
END
GO--调用函数将节点1下面的所有子节点复制到节点5下面
INSERT tb(ID,PID,Name)
SELECT a.ID,a.PID,b.Name
FROM f_CopyNode(1,5,DEFAULT) a,tb b
WHERE a.OldID=b.ID
SELECT * FROM tb
/*--结果
ID PID Name
---------------- ----------------- ----------
1 NULL 山东省
2 1 烟台市
4 2 招远市
3 1 青岛市
5 NULL 四会市
6 5 清远市
7 6 小分市
8 5 烟台市
10 5 青岛市
9 8 招远市
--*/
select * from T where HHHType=1 ordey by HHHno ASC;
循环N级
for(int i=0;i<count;i++)
{
int x=Amount(x,y)
while(x>0)
{产生子级目录吧
}
}
定义一个方法,传一个目录参数和级别数数Amount(int m,int n)
select * from T where HHHType like m%' and HHHno=(n+1);
第一:数据结构问题在你的应用中id都是“浪费的”字段
有父子关系应该建表明父子关系的相应字段节点(比如:ID,PID)第二:实现代码问题这显然是一个递归,写一个递归函数即可
的方法在遍历中选出需要的节绑定就可以了,对数据做递归遍历。