我有一个数据库表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#的!小妹才疏学浅!这里先谢过了!
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#的!小妹才疏学浅!这里先谢过了!
循环读取数据
cb.Name = "XXXX";
//绑定ComboBox,设置DisplayMember和ValueMember
................
panel1.Controls.Add(cb);在SelectIndexChanged事件中动态添加控件~~~
for (int num = 0; num < max; num++)
{
thecom[num] = new ComboBox();
thecom[num].Items.Add("这里是查寻的结果");
}
然后把DataSet的数据往里面灌,监视SelectedIndexChanged,当发生改变就再查数据库,再灌.要注意分层级,上面的改变下面的要受影响.
for (int i=0;i<上限;i++)
{
cmb[i] = new ComboBox();
cmd[i].Items.Add("内容");
}
用數據表綁定也一樣可以。這個方便點,反正是要從數據庫取數據,取過來一綁定就好了,不用寫太多太碼。
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);
}
}}
/// <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); }
}
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;
}
陕西省
---西安
----..
广东省
----广州市
这个样子的话.我记得有人用一条sql语句就搞定了!!