我有一个数据库表Menu结构如下
id Menu_name ParentID 
 1   菜单      0 
 3   重庆      1 
 4   天津      1 
 5   陕西省    1 
 8   西安市    5 
 9   广州市    6 
 10   扶风     8 
 11   深圳     6 
 12   广东省   1 其实就是一个菜单,我想用ComboBox显示!
当WinFrom窗体一加载的时候我要动态加载ComboBox,
ComboBox就加载ParentID值为1的所有项目,
当我一选择加载好项目的某一个栏目,还要动态的查找到它的下一级栏目,
并且在WinFrom窗体的Panel加载一个ComboBox,显示它的自栏目,
问题是这个菜单是个无级菜单,它的子目录可能有好几个,并且它的
Menu_name可能有重名,所有我想在加载ComboBox的时候把它的id都赋给
每一个项目!id是唯一的!这样所选择的每一项我都知道它的id,
这只是我我的想法,请各位师哥指教!我的思路是一加载一级菜单,然后通过数据库查找到它的子集,然后在一级一级的选择。
请各位师哥代码明示!C#的!小妹才疏学浅!这里先谢过了!

解决方案 »

  1.   

    云,直接有菜单就是了,你打算用多少个combox??
      

  2.   

    干嘛不用TreeView啊,多好的控件啊
      

  3.   

    要求不一样!所以用ComboBox
      

  4.   

    你想创建多少个ComboBox?创建是没问题的,循环就行了。
      

  5.   

    用TreeView或Sitemappath实现会比较理想。
      

  6.   

    跟用treeview一个思路
    循环读取数据
      

  7.   

    ComboBox cb = new ComboBox();
    cb.Name = "XXXX";
    //绑定ComboBox,设置DisplayMember和ValueMember
    ................
    panel1.Controls.Add(cb);在SelectIndexChanged事件中动态添加控件~~~
      

  8.   

    这样搞吧,首先查数据库,放数据集里面去,然后读出子目录个数,生成ComboBox数组:             ComboBox[] thecom = new ComboBox[10];
                for (int num = 0; num < max; num++)
                {
                    thecom[num] = new ComboBox();
                    thecom[num].Items.Add("这里是查寻的结果");
                }
    然后把DataSet的数据往里面灌,监视SelectedIndexChanged,当发生改变就再查数据库,再灌.要注意分层级,上面的改变下面的要受影响.
      

  9.   

    ComboBox[]   cmb   =   new   ComboBox[你所需要的数值]; 
      for   (int i=0;i<上限;i++) 

         cmb[i]   =   new   ComboBox(); 
         cmd[i].Items.Add("内容"); 
      

  10.   

    用cmd[].items.add()也可以
    用數據表綁定也一樣可以。這個方便點,反正是要從數據庫取數據,取過來一綁定就好了,不用寫太多太碼。
      

  11.   

    推荐一个ComboTreeView控件
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    namespace Sop_MediaManage
    {
        public class ComboBoxTreeView : ComboBox
        {
            private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203;
            ToolStripControlHost treeViewHost;
            ToolStripDropDown dropDown;
            public ComboBoxTreeView()
            {
                TreeView treeView = new TreeView();
                treeView.AfterSelect+=new TreeViewEventHandler(treeView_AfterSelect);
                treeView.BorderStyle = BorderStyle.None;
               
                treeViewHost = new ToolStripControlHost(treeView);
                dropDown = new ToolStripDropDown();
                dropDown.Width = this.Width;
                dropDown.Items.Add(treeViewHost);
            }
            public void treeView_AfterSelect(object sender, TreeViewEventArgs e)
            {
                this.Text=TreeView.SelectedNode.Text;
                dropDown.Close();
            }
            public TreeView TreeView
            {
                get { return treeViewHost.Control as TreeView; }
            }
            private void ShowDropDown()
            {
                if (dropDown != null)
                {
                   treeViewHost.Size =new System.Drawing.Size(DropDownWidth-2,DropDownHeight);       
                   dropDown.Show(this, 0, this.Height);
                }
            }
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN)
                {
                    ShowDropDown();
                    return;
                }        
                base.WndProc(ref m);
            }
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (dropDown != null)
                    {
                        dropDown.Dispose();
                        dropDown = null;
                    }
                }
                base.Dispose(disposing);
            }
        }}
      

  12.   

    用法:
     /// <summary>
            /// 初始化ComboBoxTree
            /// </summary>
            private void InitMcdTypeTree()
            {
                TreeView treeView = this.txtMcdType.TreeView;
                CSop_DataCompressor ds = sv_OrderMgr.ProductCate();
                g_TreeDT = ds.Tables[0];
                DataRow[] dataRow = g_TreeDT.Select(string.Format("colid='{0}'",CNST_TOPDPT));            if (dataRow.Length > 0)
                {
                    TreeNode root = new TreeNode();                root.Text = dataRow[0]["colName"].ToString();
                    root.Name = dataRow[0]["colID"].ToString();
                    //增加树的根节点
                    treeView.Nodes.Add(root);
                    root.ExpandAll();
                    addNode(root, root.Name);
                }        }        /// <summary>
            /// 递规添加TreeView节点
            /// </summary>
            /// <param name="node"></param>
            /// <param name="parentID"></param>
            public void addNode(TreeNode node, string parentID)
            {
                DataRow[] dataRows = g_TreeDT.Select(string.Format("colPrtID='{0}'", parentID));            foreach (DataRow row in dataRows)
                {
                    TreeNode subNode = new TreeNode();
                    subNode.Text = row["colName"].ToString();
                    subNode.Name = row["colID"].ToString();
                    node.Nodes.Add(subNode);
                    addNode(subNode, subNode.Name);            }
            }
      

  13.   


            private void Form1_Load(object sender, EventArgs e)
            {
                // TODO: 这行代码将数据加载到表“junxuDB3DataSet.Base_Clerk”中。您可以根据需要移动或移除它。
                //this.base_ClerkTableAdapter1.Fill(this.junxuDB3DataSet.Base_Clerk);
                // TODO: 这行代码将数据加载到表“junxuDBDataSet.BM_Rank”中。您可以根据需要移动或移除它。
                this.bM_RankTableAdapter.Fill(this.junxuDBDataSet.BM_Rank);
                // TODO: 这行代码将数据加载到表“junxuDBDataSet.Base_Clerk”中。您可以根据需要移动或移除它。
                this.base_ClerkTableAdapter.Fill(this.junxuDBDataSet.Base_Clerk);
                bs.DataSource = dt;
                dgGrid.DataSource = bs;
                //txtID.DataBindings.Add(new Binding("Text", bs, "Id"));            isLoading = false;            //数据源
                dt.Columns.Add("id", typeof(int));
                dt.Columns.Add("Menu_name", typeof(string));
                dt.Columns.Add("ParentID", typeof(int));
                dt.Rows.Add(1, "菜单", 0);
                dt.Rows.Add(3, "重庆", 1);
                dt.Rows.Add(4, "天津", 1);
                dt.Rows.Add(5, "陕西省", 1);
                dt.Rows.Add(8, "西安市", 5);
                dt.Rows.Add(9, "广州市", 6);
                dt.Rows.Add(10, "扶风", 8);
                dt.Rows.Add(11, "深圳", 6);
                dt.Rows.Add(12, "广东省", 1);            //初始combobox的数据源
                DataTable cmbInitDt = dt.Copy();
                cmbInitDt.DefaultView.RowFilter = "ParentID=1";
                cmbInit.ValueMember = "id";
                cmbInit.DisplayMember = "Menu_name";
                cmbInit.DataSource = cmbInitDt.DefaultView;
            }        private void cmbInit_SelectedIndexChanged(object sender, EventArgs e)
            {
                pnClear((Control)sender);
                if (dt.Select(string.Format("ParentID={0}", ((ComboBox)sender).SelectedValue)).Length > 0)
                    addCombobox((Control)sender, ((ComboBox)sender).SelectedValue.ToString());
            }        /// <summary>
            /// 清除位置在改变的控件位置下的所有控件
            /// </summary>
            /// <param name="sender"></param>
            void pnClear(Control sender)
            {
                
                for (int i = 0; i < pn.Controls.Count; i++)
                {
                    if (pn.Controls[i].Top <= sender.Top) continue;
                    pn.Controls.Remove(pn.Controls[i]);
                    i--;
                }
            }        /// <summary>
            /// 添加新的ComboBox
            /// </summary>
            /// <param name="ctrl"></param>
            /// <param name="ctrlName"></param>
            void addCombobox(Control ctrl, string ctrlName)
            {
                ComboBox cb = new ComboBox();
                cb.SelectedIndexChanged += new EventHandler(cmbInit_SelectedIndexChanged);
                cb.Name = ctrlName;
                cb.Parent = pn;
                cb.Top = ctrl.Top + ctrl.Height + 5;
                cb.Left = ctrl.Left;            DataTable cbDt = dt.Copy();
                cbDt.DefaultView.RowFilter = string.Format("ParentID={0}", ((ComboBox)ctrl).SelectedValue);
                cb.ValueMember = "id";
                cb.DisplayMember = "Menu_name";
                cb.DataSource = cbDt.DefaultView;
            }
      

  14.   

    唉呀,在公司不敢太嚣张,前面几行忘了删掉~orz
      

  15.   

    你想显示成什么样子!如果是:
    陕西省
     ---西安
     ----..
    广东省
     ----广州市
    这个样子的话.我记得有人用一条sql语句就搞定了!!
      

  16.   

    ComboBox都是动态生成并加载的?这样在布局上可是比较麻烦啦。