忘记了 发到我邮箱 麻烦了 [email protected]
解决方案 »
- IE没有了禁用脚本调试选项了! 急啊 。
- DataList无法横向显示数据
- asp.net treeview
- js 移动DIV 并且可以交换DIV的位置
- 问一个高手看来非常简单的问题。
- ******************请教愚翁,WebDiyer,孟子E章,关于c#里调用c++写的dll的问题***************************
- 大善事!!!收集asp.net书籍开源代码 wrox 红皮书等,方便自己也方便后人学习!特送100分酬谢!
- 求一个正则表达式
- **高分求助!!我在datagrid里面加了一列为CheckBox,点击画面上的一个button把datagrid里CheckBox被选中的行删掉,该怎么做?谢谢!!
- HTML控件和web控件有什么不同?
- .net怎样在服务器返回一个数组到页面的js里面,不是用get方法
- sql server 2008有没有可以完整下载的?
{
SystemDataAccess sda = new SystemDataAccess();
System.Windows.Forms.TreeNode RootNode = new TreeNode();
tree.Nodes.Clear();
tree.Nodes.Add(addNots("Root", "工序库", 0, RootNode));
//tree.ExpandAll();
}//加载工序库tree public System.Windows.Forms.TreeNode addNots(string Name, String NodeName, int Tab, System.Windows.Forms.TreeNode RootNode)
{
SystemDataAccess sda = new SystemDataAccess();
string depstr = "select StepCode as 工序库编码 ,StepName as 工序库名称 ,PreStep as 所属上级工序库编码 from M_Steps where PreStep='" + Name.Trim() + "'";
DataTable table = new DataTable();
System.Data.SqlClient.SqlConnection sqlcon = new System.Data.SqlClient.SqlConnection();
sqlcon.ConnectionString = sda.getConStr();
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(depstr, sqlcon);
da.Fill(table);
System.Windows.Forms.TreeNode nodenew = new TreeNode(NodeName);
nodenew.Name = Name;
for (int i = 0; i <= table.Rows.Count - 1; i++)
{
Tab++;
string tempa = table.Rows[i][0].ToString().Trim();
string tempb = table.Rows[i][1].ToString().Trim();
//nodenew.Nodes[nodenew.Nodes.Count].Name = tempa;
nodenew.Nodes.Add(addNots(tempa, tempb, Tab, RootNode));
Tab--;
} table.Clear();
return nodenew;
}//递归加载树tree
{
SystemDataAccess sda = new SystemDataAccess();
string depstr = "select StepCode as 工序库编码 ,StepName as 工序库名称 ,PreStep as 所属上级工序库编码 from M_Steps where PreStep='" + Name.Trim() + "'";
DataTable table = new DataTable();
System.Data.SqlClient.SqlConnection sqlcon = new System.Data.SqlClient.SqlConnection();
sqlcon.ConnectionString = sda.getConStr();
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(depstr, sqlcon);
da.Fill(table);
System.Windows.Forms.TreeNode nodenew = new TreeNode(NodeName);
nodenew.Name = Name;
for (int i = 0; i <= table.Rows.Count - 1; i++)
{
Tab++;
string tempa = table.Rows[i][0].ToString().Trim();
string tempb = table.Rows[i][1].ToString().Trim();
//nodenew.Nodes[nodenew.Nodes.Count].Name = tempa;
nodenew.Nodes.Add(addNots(tempa, tempb, Tab, RootNode));
Tab--;
} table.Clear();
return nodenew;
}//递归加载树tree public void loadtree(System.Windows.Forms.TreeView tree)
{
SystemDataAccess sda = new SystemDataAccess();
System.Windows.Forms.TreeNode RootNode = new TreeNode();
tree.Nodes.Clear();
tree.Nodes.Add(addNots("Root", "工序库", 0, RootNode));
//tree.ExpandAll();
}//加载工序库tree
public static OleDbConnection DBConn()
{
return new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
} //从数据库初始化控件treeView
public static void treeViewInit(TreeView treeView1)
{
using (OleDbConnection conn = DBConn())
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("select * from nodes", conn);
OleDbDataReader oleReader = cmd.ExecuteReader();
while (oleReader.Read())
{
string[] nodes = oleReader["nodeName"].ToString().Split('/');
string nodeID = oleReader["nodeID"].ToString();
TreeNode curNode= new TreeNode();//当前结点
for (int i = 0; i < nodes.Length; i++)
{
if (i == 0)
{
bool addNode = true;
for (int j = 0; j < treeView1.Nodes.Count; j++)
{
if (nodes[0] == treeView1.Nodes[j].Text)
{
curNode = treeView1.Nodes[j];//设为当前结点
addNode = false;
break;
}
}
if (addNode == true)
{
TreeNode tempNode = new TreeNode(nodes[0]);
treeView1.Nodes.Add(tempNode);
curNode = tempNode;//设为当前结点
}
}
else
{
bool addNode = true;
for (int k = 0; k < curNode.ChildNodes.Count; k++)
{
if (nodes[i] == curNode.ChildNodes[k].Text)
{
addNode = false;
curNode = curNode.ChildNodes[k];//设为当前节点
break;
} }
if (addNode == true)
{
TreeNode tempNode = new TreeNode(nodes[i]);
curNode.ChildNodes.Add(tempNode);
curNode = tempNode;//设为当前结点
}
}
}
curNode.Value = "类" + nodeID;//设置属性
} }
}
数据库中的的表是如下结构.
表nodes 就只有两个字段
nodeID int类型
nodeName 长符串就可以.nodeID nodeName
1 合作伙伴
2 兴安县
3 兴安县/兴安镇
4 灵桂县
5 桂林市
6 公司客户登记表
7 公司客户登记表/余波
8 公司客户登记表/欧阳
9 公司客户登记表/谢金海
10 东北地区
11 西北地区
12 西南地区
13 桂林市/七星区
14 学习
15 中国
16 西北地区/广东
17 东北地区/黑龙江
18 东北地区/北京
19 中国/广西分隔用/
body,td,th
{
font-size:12px;
vertical-align:top;
}
th
{
layout-flow:vertical-ideographic ;
}
</style><TABLE border=1>
<TR>
<TD colspan=3 align=center>两种树型结构SQL的对比.htm</TD>
</TR>
<TR>
<TH>名称</TH>
<TD>方法1:父子结构Tree1表</TD>
<TD>方法2:编码结构Tree2表</TD>
</TR>
<TR>
<TH>数据形式</TH>
<TD>
<xmp>
id pId content
--------------------------------------
1 0 节点
2 0 节点
...
11 1 节点
...
21 2 节点
...
121 12 节点
...
1110 110 节点
</xmp>
</TD>
<TD>
<xmp>
id nodeCode content
--------------------------------------
1 001 节点
2 002 节点
...
11 001001 节点
...
112 001001002 节点
...
1104 010010004 节点
...
</xmp>
</TD>
</TR><TR>
<TH>建表语句</TH>
<TD>
<xmp>
CREATE TABLE [dbo].[Tree1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[pId] [int] NULL ,
[content] [varchar] (10) NULL
) ON [PRIMARY]
</xmp>
</TD>
<TD>
<xmp>
CREATE TABLE [dbo].[Tree2] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[nodeCode] [varchar] (120) NOT NULL ,
[content] [varchar] (10) NULL
) ON [PRIMARY]
</xmp>
</TD>
</TR>
<TR>
<TH>插入数据10+100+1000条,深度3,广度10</TH>
<TD>
<xmp>--truncate table Tree1
declare @E int--广度循环变量
declare @EE int--广度循环变量
declare @EEE int--广度循环变量
declare @pId int--父id
declare @content varchar(10)set @content='节点'
--添加第1层10个节点
set @E=1
while @E<=10
begin
set @pId=0
insert tree1(pId,content) values(@pId,@content)
set @E=@E+1
end
--添加第2层100个节点
set @E=1
while @E<=10
begin
set @EE=1
while @EE<=10
begin
set @pId=@E
insert tree1(pId,content) values(@pId,@content)
set @EE=@EE+1
end
set @E=@E+1
end
--添加第3层1000个节点
set @E=1
while @E<=10
begin
set @EE=1
while @EE<=10
begin
set @EEE=1
while @EEE<=10
begin
set @pId=@E*10 + @EE
insert tree1(pId,content) values(@pId,@content)
set @EEE=@EEE+1
end
set @EE=@EE+1
end
set @E=@E+1
end
--select count(*) from tree1</xmp>
</TD>
<TD>
<xmp>--truncate table Tree2
declare @nodeCode varchar(30)
declare @content varchar(10)
declare @E int--广度循环变量
declare @EE int--广度循环变量
declare @EEE int--广度循环变量
set @content='节点'--添加第1层10个节点
set @E=1
while @E<= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)),3)
insert Tree2(nodeCode,content) values(@nodeCode,@content)
set @E=@E+1
end
--添加第2层100个节点
set @E=1
while @E<= 10
begin
set @EE=1
while @EE<= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)),3)
set @nodeCode =@nodeCode + right(rtrim(str(1000 + @EE)),3)
insert Tree2(nodeCode,content) values(@nodeCode,@content)
set @EE=@EE+1
end
set @E=@E+1
end
--添加第3层1000个节点
set @E=1
while @E<= 10
begin
set @EE=1
while @EE<= 10
begin
set @EEE=1
while @EEE<= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)),3)
set @nodeCode =@nodeCode + right(rtrim(str(1000 + @EEE)),3)
insert Tree2(nodeCode,content) values(@nodeCode,@content)
set @EEE=@EEE+1
end
set @EE=@EE+1
end
set @E=@E+1
end
select count(*) from tree2</xmp>
</TD>
</TR>
<TR>
<TH>得到节点深度和排序的办法</TH>
<TD>
<xmp>
用函数,本例是邹建写的,效率比较高。
create function get_Deep_tree1()
returns @re table([id] int,[level] int,sid varchar(8000))
as
begin
declare @l int
set @l=0
insert @re select [id],@l,right(10000+[id],4)
from [tree1] where [pid]=0
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.[id],@l,b.sid+right(10000+a.[id],4)
from [tree1] a,@re b
where a.[pid]=b.[id] and b.[level]=@l-1
end
return
end
go
</xmp>
</TD>
<TD>
<xmp>
节点深度就是编码长度/3
len(nodeCode)/3
排序只要order by nodeCode asc就可以得到
web叶面需要的
</xmp>
</TD>
</TR><TH>查询排序</TH>
<TD>
<xmp>
select a.id,a.content,b.[level]+1 深度
from [tree1] a,get_Deep_tree1() b
where a.[id]=b.[id]
order by b.sid
</xmp>
</TD>
<TD>
<xmp>select *,len(nodeCode)/3 深度 from tree2 order by nodeCode asc
</xmp>
</TD>
</TR>
<TR>
<TH>排序结果</TH>
<TD>
<xmp>
id content 深度
1 节点 1
11 节点 2
111 节点 3
..
120 节点 3
12 节点 2
...
1072 节点 3
</xmp>
</TD>
<TD>
<xmp>id nodeCode content 深度
1 001 节点 1
11 001001 节点 2
111 001001001 节点 3
...
210 001010010 节点 3
2 002 节点 1
21 002001 节点 2
211 002001001 节点 3
...
1088 010008008 节点 3
...
1101 010010001 节点 3
</xmp>
</TD>
</TR>
<TR>
<TH>查询时间</TH>
<TD>
<xmp>
30毫秒左右
</xmp>
</TD>
<TD>
<xmp>15毫秒左右
</xmp>
</TD>
</TR>
</TABLE>