using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;namespace XTreeViewDemo
{
public partial class Form1 : Form
{
private String LoadingKey = "57868058-716C-4D36-B48E-D840AA2C50C3";
private TreeView treeView1;
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
this.BuildTreeView();
} private void BuildTreeView()
{
if (this.treeView1 == null)
{
this.treeView1 = new TreeView();
//this.treeView1.Location = new Point(0, 25);
//this.treeView1.Size = new Size(292, 248);
this.treeView1.Dock = DockStyle.Fill;
this.Controls.Add(this.treeView1);
this.treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand);
} this.treeView1.BeginUpdate();
this.BuildGroupNode(this.treeView1.Nodes, 0);
this.treeView1.EndUpdate();
} private DataTable GetGroupDataTable(int parentId)
{
String connectionString = "server=XXY;database=X;Integrated Security=SSPI;";
String commandText = @"
SELECT A.FInterID
, A.FParentID
, A.FName
, A.FNumber
, ChildGroupCount = ISNULL(B.ChildGroupCount, 0)
, ChildICbomCount = ISNULL(C.ChildICbomCount, 0)
FROM ICBOMGROUP A
LEFT OUTER JOIN
(
SELECT FParentID
, ChildGroupCount = SUM(1)
FROM ICBOMGROUP GROUP BY FParentID
) B ON A.FInterID = B.FParentID
LEFT OUTER JOIN
(
SELECT FParentID
, ChildICbomCount = SUM(1)
FROM ICBOM GROUP BY FParentID
) C ON A.FInterID = C.FParentID
WHERE A.FParentID = @ParentId
"; using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, connectionString))
{
adapter.SelectCommand.Parameters.AddWithValue("@ParentId", parentId);
adapter.SelectCommand.CommandTimeout = 0; DataSet ds = new DataSet();
adapter.Fill(ds); return ds.Tables[0];
}
} private DataTable GetICbomDataTable(int parentId)
{
String connectionString = "server=XXY;database=X;Integrated Security=SSPI;";
String commandText = @"SELECT * FROM ICBOM WHERE FParentID = @ParentId"; using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, connectionString))
{
adapter.SelectCommand.Parameters.AddWithValue("@ParentId", parentId);
adapter.SelectCommand.CommandTimeout = 0; DataSet ds = new DataSet();
adapter.Fill(ds); return ds.Tables[0];
}
} private void BuildGroupNode(TreeNodeCollection nodes, int parentId)
{
try
{
DataTable dt = this.GetGroupDataTable(parentId);
foreach (DataRow dataRow in dt.Rows)
{
DataNode dataNode = new DataNode(); dataNode.Id = (Int32)dataRow["FInterID"];
dataNode.Text = dataRow["FNumber"].ToString() + '(' + dataRow["FName"].ToString() + ')';
dataNode.Row = dataRow;
if ((int)dataRow["ChildGroupCount"] > 0 ||
(int)dataRow["ChildICbomCount"] > 0)
{
dataNode.Nodes.Add(this.CreateLoadingNode()); // 添加一个特殊节点,它的存在标志它的父节点需要动态加载
}
nodes.Add(dataNode);
// this.BuildTreeView(node.Nodes, fPath); // 取消递归,在 BeforeExpand 事件中添加子级节点
} }
catch (Exception e)
{
MessageBox.Show(e.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} private void BuildIcomNode(TreeNodeCollection nodes, int parentId)
{
DataTable dt = this.GetICbomDataTable(parentId);
foreach (DataRow dataRow in dt.Rows)
{
DataNode dataNode = new DataNode();
dataNode.Tag=dataRow["FBOMNumber"].ToString();//这是偶添加的最后节点的值的代码,用于赋于在选择末节点后连动datagridview控件的值
dataNode.Id = (Int32)dataRow["FInterID"];
dataNode.Text = dataRow["FBOMNumber"].ToString();
dataNode.Row = dataRow;
nodes.Add(dataNode);
}
} public TreeNode CreateLoadingNode()
{
// 创建一个特殊节点,它的存在标志它的父节点需要动态加载
DataNode dataNode = new DataNode();
dataNode.Type = this.LoadingKey;
return dataNode;
} private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
DataNode dataNode = (DataNode)e.Node; if (dataNode.Nodes.Count == 1 &&
((DataNode)dataNode.Nodes[0]).Type == this.LoadingKey)
{
// 若特殊节点存在,移除它,并为它的父节点创建子节点
dataNode.Nodes[0].Remove(); DataRow dataRow = (DataRow)dataNode.Row; if ((int)dataRow["ChildGroupCount"] > 0 )
this.BuildGroupNode(dataNode.Nodes, dataNode.Id);
else
this.BuildIcomNode(dataNode.Nodes, dataNode.Id);
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString(); using (SqlDataAdapter adapter = new SqlDataAdapter("t_BOM1", "server=192.100.3.3;database=GADMEIERP;uid=sa;pwd=;"))
{
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand.Parameters.AddWithValue("@FBOMNumber", number);
DataSet ds = new DataSet();
adapter.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];
}
} } public class DataNode : TreeNode
{
public Int32 Id { get; set; }
public String Type { get; set; }
public DataRow Row { get; set; } public DataNode() : base() { }
}
}
偶的SQL存储过程传递值无问题,在SQL上用
exec t_BOM1 @FBOMNumber='BOM000002'查询有结果string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString();
这句传递当前选中的末节点的值赋予变量number,然后传递number的值至存储过程"t_BOM1"中,这个number的值是否是当前选中节点的值还是空值?不知道该如何去查探?????偶个人想法认为是这个number值没有传递到treeview当前选中末节点的值
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString(); using (SqlDataAdapter adapter = new SqlDataAdapter("t_BOM1", "server=192.100.3.3;database=GADMEIERP;uid=sa;pwd=;"))
{
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand.Parameters.AddWithValue("@FBOMNumber", number);
DataSet ds = new DataSet();
adapter.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];
}
}
这段传递过来的FBOMNumber值始终有问题SQL测试数据如下:
-- 生成测试数据(ICBOMGROUP表)
IF OBJECT_ID('ICBOMGROUP') IS NOT NULL
DROP TABLE ICBOMGROUP
CREATE TABLE ICBOMGROUP (
FInterID INT
, FParentID INT
, FName VARCHAR(40)
, FNumber VARCHAR(40) )
INSERT ICBOMGROUP
SELECT 1039,0,'产品','0' UNION ALL
SELECT 2296,0,'喷印机壳','1' UNION ALL
SELECT 6497,0,'丝印彩盒','2' UNION ALL
SELECT 7035,0,'外发加工','3' UNION ALL
SELECT 1041,1039,'VGA电视盒','01' UNION ALL
SELECT 1071,1041,'TV3488B系列','01.01' UNION ALL
SELECT 1140,1071,'TV2188E BOM','01.01.01' UNION ALL
SELECT 1144,1140,'普通订单','01.01.01.01' UNION ALL
SELECT 1146,1144,'TV2188E 中文BOM','01.01.01.01.01' UNION ALL
SELECT 1145,1140,'特殊订单','01.01.01.02' UNION ALL
SELECT 1129,1039,'XGA电视盒','02' UNION ALL
SELECT 1199,1129,'TV5811系列','02.02' UNION ALL
SELECT 1212,1199,'TV5811 BOM','02.02.01' UNION ALL
SELECT 2297,2296,'机壳-上盖','1.01' UNION ALL
SELECT 2308,2297,'GM998','01.01.01' UNION ALL
SELECT 2312,2308,'GM998上盖 灰色ABS/喷银色','1.01.01.01' UNION ALL
SELECT 7039,7035,'支架组件','3.01' UNION ALL
SELECT 7040,7039,'PD1048','3.01.01' UNION ALL
SELECT 7172,7040,'PD1048支架组件1','3.01.01.01'//ICBOM表
if object_id('ICBOM') is not null drop table ICBOM
create table ICBOM (FInterID varchar(40),FParentID varchar(40),FBOMNumber varchar(40)
insert ICBOM
select '3000','1071','BOM00071' union all
select '3001','1071','BOM00072'//存储过程
create procedure t_BOM1
@FBOMNumber varchar(4000)
as
select FBOMNumber as BOM单编号,FInterID as BOM内码
from ICBOM
where FBOMNumber=@FBOMNumber请高手指点
--------------------------------------------------------------------------------
解决方案 »
- 关于多线程程序执行不稳定的问题!
- code 128条码算法?
- dateTimePicker查询问题错误
- 大大们,请教一个问题,是microsoft.windowsmobile.forms
- 请教src绑定到变量(非数据库字段)的问题:<img src=" <%# GetPath(Eval("ServerIP"), Eval("filename")) %>" alt="缩略图"> 是这样吗?
- 急!!!!!!!望高手帮忙解决
- 这种情况下如何刷新父窗体?
- 微信公共平台开发 .net
- C# WEBBROWSER 关闭弹出对话框
- c#调试状态在代码后面显示变量值的扩展插件是什么?
- C# 子窗口无法弹出的问题
- C#中将table中为image的数据写到Excel中的cell中
这个number的值是否是当前选中节点的值还是空值?不知道该如何去查探????? 查找制定 节点 也用递归
FOR 树.childnode
private void GetChildTree(TreeNode node)
{
string strId=""
foreach (TreeNode nd in node.ChildNodes)
{
if (nd.Checked)
{
strId+nd.Value.ToString().Trim()+",";
}
else
{
}
if(nd.ChildNodes.Count >0)
GetChildTree(nd);
}
}
private void GetTree(TreeNode node)
{
if (node.Checked == true)
{
string s=node.Value.ToString().Trim();
}
else
{
}
}
有子项就先建立个loading子节点,
等点节点发现有个loading子节点就删除loading子节点
然后根据datarow建真正的子节点
这种做法有点特别,存datarow好像没什么必要
你不是已经
dataNode.Text = dataRow["FBOMNumber"].ToString();
了么,那
string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString();
改成直接
string number =dataNode.Text;
不就可以了
关键是这个dataNode.Text传递的值传递不到存储过程"t_BOM1"中
{
DataTable dt = this.GetICbomDataTable(parentId);
foreach (DataRow dataRow in dt.Rows)
{
DataNode dataNode = new DataNode();
dataNode.Tag=dataRow["FBOMNumber"].ToString();//这是偶添加的最后节点的值的代码,用于赋于在选择末节点后连动 datagridview控件的值
dataNode.Id = (Int32)dataRow["FInterID"];
dataNode.Text = dataRow["FBOMNumber"].ToString();
dataNode.Row = dataRow;
nodes.Add(dataNode);
}
}
在此方法下添加末节点的值,连动datagridview