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请高手指点     
 --------------------------------------------------------------------------------

解决方案 »

  1.   

    DataNode dataNode = new DataNode();  DataNode是什么类?
      

  2.   

    代码 真多treeView1.selectValue或递归 遍历所有节点判断 节点的selected属性 是否 TRUE 
    这个number的值是否是当前选中节点的值还是空值?不知道该如何去查探????? 查找制定 节点 也用递归
    FOR 树.childnode
      

  3.   

    代码太多,列出问题
     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
                {
                }
            }
      

  4.   

    把datarow存在节点里?
    有子项就先建立个loading子节点,
    等点节点发现有个loading子节点就删除loading子节点
    然后根据datarow建真正的子节点
    这种做法有点特别,存datarow好像没什么必要
    你不是已经
    dataNode.Text = dataRow["FBOMNumber"].ToString(); 
    了么,那
    string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString(); 
    改成直接
    string number =dataNode.Text;
    不就可以了
      

  5.   


    关键是这个dataNode.Text传递的值传递不到存储过程"t_BOM1"中
      

  6.   

    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); 
                } 
            } 
    在此方法下添加末节点的值,连动datagridview