int i;
DataSet ds = new DataSet();
public static bool bl1 = true;
private void button8_Click_2(object sender, EventArgs e)
{
for (i = 0; i < treeView1.SelectedNode.Nodes.Count; i++)
{
bl1 = false;
ds = sql1.dataset(@"SELECT PRODUCT.PRO_CAT,PRODUCT.PRO_NAME,PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO FROM PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID=''", "Print" + i.ToString());
string[] s;
s = treeView1.SelectedNode.Nodes[i].Text.Split(' ');
dr = sql1.recursion_SqlDataReader("select PRODUCT.PRO_CAT,PRODUCT.PRO_NAME, PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO from PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID='" + s[0] + "' and BOM_MOT_AMO='" + s[s.Length - 2] + "'");
if (dr.HasRows)
{
while (dr.Read())
{
DataRow DataRow1 = ds.Tables["Print" + i.ToString()].NewRow();
DataRow1.BeginEdit();
DataRow1[0] = dr[0].ToString().Trim();
DataRow1[1] = dr[1].ToString().Trim();
DataRow1[2] = dr[2].ToString().Trim();
DataRow1[3] = dr[3].ToString().Trim();
DataRow1[4] = dr[4].ToString().Trim();
DataRow1.EndEdit();
ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
recursion_table(ds, dr[0].ToString().Trim(), dr[4].ToString().Trim());
//TreeNode tn1 = new TreeNode(dr[0].ToString().Trim() + " " + dr[1].ToString().Trim());
//recursion(tn1, tn1.Text.Trim());
//Node.Nodes.Add(tn1);
}
}
dr.Close();
sql1.connClose(); } sql2.connClose();
//dataGrid1.DataSource = ds.Tables["Print1"]; Print f3 = new Print();
CrystalReport1 CR = new CrystalReport1();
CR.SetDataSource(ds);
f3.crystalReportViewer1.ReportSource = CR;
f3.Show();
}
private void recursion_table(DataSet ds, string id, string number)
{
dr1 = sql2.recursion_SqlDataReader("select PRODUCT.PRO_CAT,PRODUCT.PRO_NAME, PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO from PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID='" + id + "' and BOM_MOT_AMO='" + number + "'");
if (dr1.HasRows)
{
int i = 0;
while (dr1.Read())
{
DataRow DataRow1 = ds.Tables["Print" + i.ToString()].NewRow();
DataRow1.BeginEdit();
DataRow1[0] = dr1[0].ToString().Trim();
DataRow1[1] = dr1[1].ToString().Trim();
DataRow1[2] = dr1[2].ToString().Trim();
DataRow1[3] = dr1[3].ToString().Trim();
DataRow1[4] = dr1[4].ToString().Trim(); DataRow1.EndEdit();
ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
recursion_table(ds, dr1[0].ToString().Trim(), dr1[4].ToString().Trim());
//TreeNode tn1 = new TreeNode(dr[0].ToString().Trim() + " " + dr[1].ToString().Trim());
//recursion(tn1, tn1.Text.Trim());
//Node.Nodes.Add(tn1);
}
}
}sql2是自己写的一个数据库连接类 public SqlDataReader recursion_SqlDataReader(string sqlstr)
{
try
{
conn = new SqlConnection(connectionString);
conn.Open(); comm = new SqlCommand(sqlstr, conn);
mydr = comm.ExecuteReader(); return mydr;
}
catch (System.Data.SqlClient.SqlException E)
{
conn.Close();
throw new Exception(E.Message);
}
}
数据表结构!如下
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BOM]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[BOM]
GOCREATE TABLE [dbo].[BOM] (
[BOM_MOT_ID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BOM_MOT_AMO] [float] NOT NULL ,
[BOM_CHI_ID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BOM_CHI_AMO] [float] NOT NULL
) ON [PRIMARY]
GO有一组数据 如下(树结构)
-G
-A
-A1
-A1A
-A1B
-A1C
-A2
-A2A
-A2B
-A2C
-A3得到表的结构是
-G
-A
-A1
-A1A
-A2
-A2A
-A3因为递归到A1A的时候ID变成了A1A 而不是A1 所以他的子A1B和A1C找不到父A1就显示不出来
这里要怎么在递归的时候保持A1的值先好,想不出好的办法!高手救救啊!
DataSet ds = new DataSet();
public static bool bl1 = true;
private void button8_Click_2(object sender, EventArgs e)
{
for (i = 0; i < treeView1.SelectedNode.Nodes.Count; i++)
{
bl1 = false;
ds = sql1.dataset(@"SELECT PRODUCT.PRO_CAT,PRODUCT.PRO_NAME,PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO FROM PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID=''", "Print" + i.ToString());
string[] s;
s = treeView1.SelectedNode.Nodes[i].Text.Split(' ');
dr = sql1.recursion_SqlDataReader("select PRODUCT.PRO_CAT,PRODUCT.PRO_NAME, PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO from PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID='" + s[0] + "' and BOM_MOT_AMO='" + s[s.Length - 2] + "'");
if (dr.HasRows)
{
while (dr.Read())
{
DataRow DataRow1 = ds.Tables["Print" + i.ToString()].NewRow();
DataRow1.BeginEdit();
DataRow1[0] = dr[0].ToString().Trim();
DataRow1[1] = dr[1].ToString().Trim();
DataRow1[2] = dr[2].ToString().Trim();
DataRow1[3] = dr[3].ToString().Trim();
DataRow1[4] = dr[4].ToString().Trim();
DataRow1.EndEdit();
ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
recursion_table(ds, dr[0].ToString().Trim(), dr[4].ToString().Trim());
//TreeNode tn1 = new TreeNode(dr[0].ToString().Trim() + " " + dr[1].ToString().Trim());
//recursion(tn1, tn1.Text.Trim());
//Node.Nodes.Add(tn1);
}
}
dr.Close();
sql1.connClose(); } sql2.connClose();
//dataGrid1.DataSource = ds.Tables["Print1"]; Print f3 = new Print();
CrystalReport1 CR = new CrystalReport1();
CR.SetDataSource(ds);
f3.crystalReportViewer1.ReportSource = CR;
f3.Show();
}
private void recursion_table(DataSet ds, string id, string number)
{
dr1 = sql2.recursion_SqlDataReader("select PRODUCT.PRO_CAT,PRODUCT.PRO_NAME, PRODUCT.PRO_DES2,PRODUCT.PRO_UNIT,BOM_CHI_AMO from PRODUCT INNER JOIN BOM ON PRODUCT.PRO_CAT = BOM.BOM_CHI_ID where BOM_MOT_ID='" + id + "' and BOM_MOT_AMO='" + number + "'");
if (dr1.HasRows)
{
int i = 0;
while (dr1.Read())
{
DataRow DataRow1 = ds.Tables["Print" + i.ToString()].NewRow();
DataRow1.BeginEdit();
DataRow1[0] = dr1[0].ToString().Trim();
DataRow1[1] = dr1[1].ToString().Trim();
DataRow1[2] = dr1[2].ToString().Trim();
DataRow1[3] = dr1[3].ToString().Trim();
DataRow1[4] = dr1[4].ToString().Trim(); DataRow1.EndEdit();
ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
recursion_table(ds, dr1[0].ToString().Trim(), dr1[4].ToString().Trim());
//TreeNode tn1 = new TreeNode(dr[0].ToString().Trim() + " " + dr[1].ToString().Trim());
//recursion(tn1, tn1.Text.Trim());
//Node.Nodes.Add(tn1);
}
}
}sql2是自己写的一个数据库连接类 public SqlDataReader recursion_SqlDataReader(string sqlstr)
{
try
{
conn = new SqlConnection(connectionString);
conn.Open(); comm = new SqlCommand(sqlstr, conn);
mydr = comm.ExecuteReader(); return mydr;
}
catch (System.Data.SqlClient.SqlException E)
{
conn.Close();
throw new Exception(E.Message);
}
}
数据表结构!如下
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[BOM]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[BOM]
GOCREATE TABLE [dbo].[BOM] (
[BOM_MOT_ID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BOM_MOT_AMO] [float] NOT NULL ,
[BOM_CHI_ID] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BOM_CHI_AMO] [float] NOT NULL
) ON [PRIMARY]
GO有一组数据 如下(树结构)
-G
-A
-A1
-A1A
-A1B
-A1C
-A2
-A2A
-A2B
-A2C
-A3得到表的结构是
-G
-A
-A1
-A1A
-A2
-A2A
-A3因为递归到A1A的时候ID变成了A1A 而不是A1 所以他的子A1B和A1C找不到父A1就显示不出来
这里要怎么在递归的时候保持A1的值先好,想不出好的办法!高手救救啊!
G
|--A
| |-A1
| |-A1A
| |-A1B
| |-A1C
|
|-A2
| |-A2A
| |-A2B
......
....
先查A,查到了A1,A2,循环加入A的子节点(while(SQLDataReader.read()))
再遍历A的子节点(foreach(Node node in Tree.Nodes[0].Nodes),每个子节点都查一次,查到了就循环加入A的子节点的子节点(while(SQLDataReader.read())),就这样。
{
SqlConnection cnn=...;//数据连接略
SqlCommand Cmd=Cnn.CreateCommand();
Cmd.CommandText="Select T from Table Group by T";//group避免有重复项
SqlDataReader myread=Cmd.Ex..Reader();//忘记中间几个字母了,呵呵
while(myread.read())//如果读取到记录
{
tree.Nodes.add(myread["T"].tostring());//加入节点
}
foreach(Node node1 in tree.Nodes)
{
SqlCommand Cmd1=Cnn.CreateCommand();
Cmd.CommandText="Select T from Table where T='"+node1.Text+"' Group by T";//group避免有重复项
SqlDataReader myread1=Cmd1.Ex..Reader();//忘记中间几个字母了,呵呵
while(myread1.read())//如果读取到记录
{
node1.Nodes.add(myread["T"].tostring());//加入节点
}
cmd1.dispose();
myread1.dispose();
}
.....// 释放资源代码略
}
帮你顶到高手出现
在程序里写太没效率了
{
......
int i = 0;
......
ds.Tables["Print" + i.ToString()].Rows.Add(DataRow1);
}
这里不明白,怎么递归了i又从0开始了,ds.Tables["Print0"].Rows.Add(DataRow1)又添加记录,怎么区分?
{
//查找以该节点为父节点的项
drRow = datatable.select("ParentId='"+parentId+ "'")
foreach (DataRow row in drRow)
{
TreeNode subItem = new TreeNode (键,值)
item.ChildItems.Add(subItem);
initSubTree(subItem);
}
}