none
关于treeview树节点在判断末节点后,根据末节点的Tag值,传递至SQL数据库存储过程中的参数,连动datagridview控件,显示数据,出现了问题 RRS feed

  • 问题

  • 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);
                }
            }
        }

        public class DataNode : TreeNode
        {
            public Int32 Id { get; set; }
            public String Type { get; set; }
            public DataRow Row { get; set; }

            public DataNode() : base() { }
        }
    }

    非常感谢XXY版主的指点,代码测试已经通过,现在是treeview与datagridview数据连动,出现了一些问题,根据老师的提示,偶做的一个小测试,就是treeview与datagridview的连动,只要将datagridview的数据源绑定到相应的treeview的相应节点,即在datagridview中可以显示相关数据,根据您的代码,偶添加了一段代码关于AfterSelect事件的代码,但是无法连动,不知道是不是我选择的结点的值有问题,还是怎么着?
      private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                TreeNode node = e.Node;
                SqlConnection thisconnection = new SqlConnection("server=192.100.3.3;database=GADMEIERP;uid=sa;pwd=;");
                SqlCommand cmd = thisconnection.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "t_BOM1";
                SqlParameter parameter = new SqlParameter("@FBOMNumber", SqlDbType.VarChar, 40);
                parameter.Direction = System.Data.ParameterDirection.Input;
                parameter.Value = node.Tag;
                cmd.Parameters.Add(parameter);
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                this.dataGridView1.DataSource = ds.Tables[0];
                //this.dataGridView2.DataSource = FChildBOM(id);
               
            }

    无法连动数据

     

    • 已移动 Sheng Jiang 蒋晟Moderator 2009年10月15日 21:20 Windows表单类库数据控件和数据绑定问题 (发件人:Visual C#)
    2009年10月15日 8:15

答案

  • 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];
        }
    }

    知识改变命运,奋斗成就人生!
    2009年10月15日 9:06
    版主
  • node.Tag 是null 在目前空上程序中没有使用它,我们使用的是 DataNode.Row
    知识改变命运,奋斗成就人生!
    2009年10月16日 2:23
    版主
  • 你跟踪一下SQL,看看你的值传对没有。多尝试一下。
    知识改变命运,奋斗成就人生!
    2009年10月16日 3:02
    版主

全部回复

  • 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];
        }
    }

    知识改变命运,奋斗成就人生!
    2009年10月15日 9:06
    版主
  • 谢谢XXY版主,为什么我用
    TreeNode node = e.Node;
    SqlParameter parameter = new SqlParameter("@FBOMNumber", SqlDbType.VarChar, 40);
                parameter.Direction = System.Data.ParameterDirection.Input;
                parameter.Value = node.Tag;

    这样传递值会有问题呢?

    而用string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString();就能获得结点的值呢?
    2009年10月15日 13:36
  • 运行的时候,当点击treeview最后末节点的值后还是无法连动datagridview的数据,老师有测试过没有?
    我创建的简单t_BOM存储过程:

    create procedure t_BOM1
    @FBOMNumber varchar(4000)
    as
    select FBOMNumber as BOM单编号,FInterID as BOM内码
    from ICBOM 
    where FBOMNumber=@FBOMNumber

    老师能否帮忙测试一下?
    2009年10月16日 2:16
  • node.Tag 是null 在目前空上程序中没有使用它,我们使用的是 DataNode.Row
    知识改变命运,奋斗成就人生!
    2009年10月16日 2:23
    版主
  • 你跟踪一下SQL,看看你的值传对没有。多尝试一下。
    知识改变命运,奋斗成就人生!
    2009年10月16日 3:02
    版主
  • 偶的SQL存储过程传递值无问题,在SQL上用
    exec t_BOM1 @FBOMNumber='BOM000002'查询有结果

    string number = ((DataNode)e.Node).Row["FBOMNumber"].ToString();
    这句传递当前选中的末节点的值赋予变量number,然后传递number的值至存储过程"t_BOM1"中,

    这个number的值是否是当前选中节点的值还是空值?不知道该如何去查探?????

    偶的想法是这个number值没有传递到treeview当前选中末节点的值

    老师指点一下,快到周末了,还完不成,偶就挂了

    2009年10月16日 3:30