请教一下C#树菜单的问题。比如有两个表,表一[book] 里有 id,bookname,ParentID字段。 表二[authors]有 bookid,author,price,sex字段。表一的id 与表二的tbookid 关联。表一是树的表,我想点击一个树节点,就可以关联到authors表,并且把表二的数据显示在txtbox里。这样。谢谢
怎修改下面代码呢
namespace userTV 

    public partial class Form1 : Form 
    {         public DataSet ds = new DataSet(); 
        public DataSet du = new DataSet();         public Form1() 
        { 
            InitializeComponent(); 
        } 
        private void InitTreeView(TreeView treeView) 
        { 
            treeView.CheckBoxes = false;//不显示复选框 
            treeView.FullRowSelect = true; 
            ImageList imageList = new ImageList(); 
            imageList.Images.Add(new Icon("Folder.ico")); 
            imageList.Images.Add(new Icon("OpenFolder.ico")); 
            imageList.Images.Add(new Icon("Book.ico")); 
            treeView.ImageList = imageList;//设置图像集合 
            treeView.LabelEdit = false;//设置不能编辑 
            treeView.PathSeparator = "\\";//用\符号为分隔符 
            treeView.Scrollable = true;//显示滚动条 
            treeView.ShowLines = true;//显示连线 
            treeView.ShowNodeToolTips = true; 
            treeView.ShowPlusMinus = true;//显示+-号 
            treeView.ShowRootLines = true; 
            // treeView.ImageList.Add(new Icon("Book.ico")); 
            treeView.AfterSelect += new TreeViewEventHandler(treeView1_AfterSelect); 
        } 
        public void AddTree(int ParentID, TreeNode pNode) 
        { 
            DataView dvTree = new DataView(ds.Tables[0]); 
           
            //过滤ParentID,得到当前的所有子节点   
            dvTree.RowFilter = "[PARENTID] = " + ParentID;             treeView1.ImageIndex = 0; 
            treeView1.SelectedImageIndex = 1; 
            foreach (DataRowView Row in dvTree) 
            { 
                TreeNode Node = new TreeNode(); 
                Node.ImageIndex = 0; 
                Node.SelectedImageIndex = 1; 
                if (pNode == null) 
                {   //添加根节点   
                    Node.Tag = Row["ID"].ToString(); 
                    Node.Text = Row["bookname"].ToString(); 
                    treeView1.Nodes.Add(Node);                     AddTree(Int32.Parse(Row["ID"].ToString()), Node);       //再次递归   
                } 
                else 
                {   //添加当前节点的子节点   
                    Node.Tag = Row["ID"].ToString(); 
                    Node.Text = Row["bookname"].ToString(); 
                    pNode.Nodes.Add(Node); 
                    treeView1.SelectedNode = Node;                    
                    AddTree(Int32.Parse(Row["ID"].ToString()), Node);       //再次递归                   } 
            } 
        } 
        private void AddChildNode(string strTag, string strNodeText) 
        { 
            //首先判断是否选定组件中的位置 
            if (treeView1.SelectedNode == null) 
            { 
                MessageBox.Show("请选择一个节点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 
            } 
            else 
            { 
                if (strNodeText != "") 
                { 
                    //创建一个节点对象,并初始化 
                    TreeNode tmp = new TreeNode(); 
                    tmp.Text = strNodeText;// new TreeNode(strNodeText); 
                    tmp.Tag = strTag; 
                    //在TreeView组件中加入子节点 
                    treeView1.SelectedNode.Nodes.Add(tmp); 
                    treeView1.SelectedNode = tmp; 
                    treeView1.ExpandAll(); 
                } 
                else 
                { 
                    // MessageBox.Show("TextBox组件必须填入节点名称!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 
                    return; 
                } 
            } 
        } 
        private void AddParent(string strNodeText) 
        { 
            //首先判断是否选定组件中节点的位置 
            if (treeView1.SelectedNode == null) 
            { 
                MessageBox.Show("请选择一个节点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 
            } 
            else 
            { 
                if (strNodeText != "") 
                { 
                    //创建一个节点对象,并初始化 
                    TreeNode tmp; 
                    tmp = new TreeNode(strNodeText); 
                    //在TreeView组件中加入兄弟节点 
                    treeView1.SelectedNode.Parent.Nodes.Add(tmp); 
                    treeView1.ExpandAll(); 
                } 
                else 
                { 
                    // MessageBox.Show("TextBox组件必须填入节点名称!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); 
                    return; 
                } 
            } 
            TreeNode tnode = new TreeNode(strNodeText); 
        }         private void button1_Click(object sender, EventArgs e) 
        { 
            treeView1.SelectedNode.Expand(); 
        }         private void button2_Click(object sender, EventArgs e) 
        { 
            //定位根节点 
            treeView1.SelectedNode = treeView1.Nodes[0]; 
            //展开组件中的所有节点 
            treeView1.SelectedNode.ExpandAll(); 
        } 
        private void button3_Click(object sender, EventArgs e) 
        { 
            //定位根节点 
            treeView1.SelectedNode = treeView1.Nodes[0]; 
            //折叠组件中所有节点 
            treeView1.SelectedNode.Collapse(); 
        } 
        private void treeView1_MouseDown(object sender, MouseEventArgs e) 
        { 
            if (e.Button == MouseButtons.Right) 
                contextMenu1.Show(this, new Point(e.X, e.Y)); 
        } 
        private void Form1_Load(object sender, EventArgs e) 
        { 
            SelectTrees(); 
        } 
        public void SelectTrees() 
        { 
            SqlConnection CN = new SqlConnection(); 
            try 
            { 
                //初始化连接字符串   
                CN.ConnectionString = "Data Source=.;Initial Catalog=userTV;Persist Security Info=True;User ID=sa;Password=rt;"; 
                CN.Open();                 SqlDataAdapter adp = new SqlDataAdapter("select * from bookname", CN); 
                adp.Fill(ds); 
            } 
            catch (Exception ex) 
            { 
                throw ex; 
            } 
            finally 
            { 
                CN.Close(); 
            } 
            //调用递归函数,完成树形结构的生成   
            AddTree(0, (TreeNode)null); 
        } 
        private void btnTijiao_Click(object sender, EventArgs e) 
        { 
            if (txtName.Text.Trim() == string.Empty) 
            { 
           lbError.Visible = true; 
            } 
            else 
            { 
                ds.Clear(); 
                du.Clear(); 
                SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=userTV;Persist Security Info=True;User ID=sa;Password=rt;"); 
                string sql = string.Format("insert into bookname(bookname,ParentID) values('{0}','{1}')", txtName.Text.Trim(), txtPId.Text.Trim()); 
                SqlCommand cmd = new SqlCommand(sql, conn); 
                conn.Open(); 
                int count = cmd.ExecuteNonQuery(); 
                conn.Close(); 
                if (count == 1) 
                { 
                    MessageBox.Show("成功添加");//treeView1 
                    treeView1.Nodes.Clear(); 
                    SelectTrees(); 
                } 
                lbError.Visible = false; 
            } 
        } 
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
        { 
            string str = e.Node.Tag.ToString(); 
            txtPId.Text = str; 
        } 
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
        { 
            // this.txtxiugid.Text = treeView1.FullRowSelect.ToString(); 
            string str = e.Node.Tag.ToString(); 
            string st = e.Node.Text.ToString(); 
            txtPId.Text = str; 
            txtxiugname.Text = st;         }     } 

解决方案 »

  1.   

    总感觉楼主的代码有点乱,,,
    为何不用联合查询?用TreeView的Tag值存authors表的数据呢?
      

  2.   

    请问一下,怎在dataGridView传值给comboBox呢?就是我点就dataGridView的一行数据,然后它就把相应的一个字段值显示在comboBox里
    private void Rcd2_Load(object sender, EventArgs e)
            {
                           SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=CS;Persist Security Info=True;User ID=sa;Password=rt;");
                conn.Open();
                string sql = string.Format("select StorageName from  TbShStorage");
                SqlCommand cmd = new SqlCommand(sql, conn);
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                DataSet ds = new DataSet();
                da.Fill(ds, "products");
                this.cbrcdckmc.DisplayMember = "StorageName";
              this.comboBox.DataSource = ds.Tables[0];
            private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
            {
               
                
               comboBox.Text = Convert.ToString(dgvISManage[0, dgvISManage.CurrentCell.RowIndex].Value).Trim();这样写,comboBox能显示内容了,但是点就dataGridView的数据,comboBox里没有相应的变化
      

  3.   


    //获取数据库DataTable公共方法
    DataTable getDt(string SQLTxt)
    {
      string connectString="Datasourc=...";//数据库连接字符串
      using (SqlConnection conn = new SqlConnection(connectString))
     {
         conn.Open();
          using (SqlCommand cmd = conn.CreateCommand())
          {
                cmd.CommandText = SQLTxt;
                 //若想要参数可以参考SqlParameter                   
                DataSet dataset = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(dataset);
                return dataset.Tables[0];
          }
      }
    }
    //显示树:
    void Form1_Load(object sender, EventArgs e)
    {
       DataTable dt=getDt("select * from book");
       TreeNode pNode = null;
       AddTree(0, pNode, pubdt);
    }void AddTree(int ParentID, TreeNode pNode, DataTable dt)
    {                    
        //增加Treeview
        DataView dvTree = new DataView(dt);
        dvTree.RowFilter = "[FPARENTID] = " + ParentID;
        foreach (DataRowView Row in dvTree)
        {
            TreeNode Node = new TreeNode();
            Node.Text = Row["bookname"].ToString();
            Node.Tag = Row["ID"].ToString();
            if (pNode == null)
                treeview1.Nodes.Add(Node);
            else
                pNode.Nodes.Add(Node);
            AddTree(Int32.Parse(Row["Id"].ToString()), Node,dt); //再次递归   
        }
    }//双击菜单,显示textbox
    void treeview1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        DataTable dt=getDt(string.format(select * from authors where bookid in('{0}',.Node.Tag.ToString())));
        textbox1.text=dt.rows[0]["author"].tosring();
    }
      

  4.   

    最后第2行少了个e,应为: DataTable dt=getDt(string.format(select * from authors where bookid in('{0}',e.Node.Tag.ToString())));