如何給動態生成的菜單加click事件呢?
我是根據用戶的對模塊的權限動態生成的菜單,代碼如下:
/// <summary>
/// 動態生成某部門中某用戶的菜單
/// </summary>
/// <param name="Bmbh">部門編號</param>
/// <param name="userName">用戶名</param>
/// <param name="Mkmc">模塊名稱</param>
/// <param name="m0">菜單項</param>
/// <param name="iniMkbm">模塊編碼</param>
/// <param name="Sfzjd">是否終節點</param>
private void GenMenu(string Bmbh,string userName,string Mkmc,MenuItem m0,int iniMkbm,bool Sfzjd)
{
//Define a new MenuItem
MenuItem m=new MenuItem();
m.Text=Mkmc;
if (iniMkbm.ToString().Length==4)
{
mainMenu1.MenuItems.Add(m);
}
else
{
m0.MenuItems.Add(m);
m0.Index=iniMkbm;
}
string mySql="SELECT y.mkbm,y.mkmc,y.sjmkbm,y.sfzjd FROM "+
"(select a.js,b.mkbm from b_czryjs a left join b_qxqd b on a.js=b.js "+
"where a.yhm='"+userName+"' and a.bmbh='"+Bmbh+"')x,b_mkqd y "+
"where x.mkbm=y.mkbm and y.sjmkbm="+iniMkbm+" order by y.mkbm";
SqlDataReader myDataReader=SelectData(mySql);
while (myDataReader.Read())
{
GenMenu(Bmbh,userName,myDataReader.GetString(1),m,myDataReader.GetInt32(0),myDataReader.GetBoolean(3));
}
myDataReader.Close();
}
//Get Recorders
private SqlDataReader SelectData(string Sql)
{
myConnection=new SqlConnection(connString);
myCommand=new SqlCommand(Sql,myConnection);
myConnection.Open();
return myCommand.ExecuteReader();
}
//生成用戶UserB的菜單
private void button2_Click(object sender, System.EventArgs e)
{
mainMenu1.MenuItems.Clear();
MenuItem m=new MenuItem();
string sql="SELECT y.mkbm,y.mkmc,y.sjmkbm,y.sfzjd FROM "+
"(select a.js,b.mkbm from b_czryjs a left join b_qxqd b on a.js=b.js "+
"where a.yhm='UserB' and a.bmbh='OYAMA001')x,b_mkqd y "+
"where x.mkbm=y.mkbm and y.sjmkbm=999999 order by y.mkbm";
SqlDataReader dr=SelectData(sql);
while (dr.Read())
{
GenMenu("OYAMA001","UserB",dr.GetString(1),m,dr.GetInt32(0),false);
}
}
问题点数:100、回复次数:20Top
1 楼NiuNiuTZ(风满袖)回复于 2003-07-03 09:51:20 得分 0
現在菜單是出來了,但是我怎么加click事件并且我要在里面寫相應的處理代碼呢?
Top
2 楼TheAres(班门斧)回复于 2003-07-03 09:55:49 得分 5
用映射来完成,具体看看我写过的这个代码。
http://expert.csdn.net/Expert/topic/1612/1612509.xml?temp=.5595209Top
3 楼oh_love(小熊)回复于 2003-07-03 09:59:05 得分 1
m.MenuItems[0].Click +=new EventHandler(MenuItem_Click);Top
4 楼NiuNiuTZ(风满袖)回复于 2003-07-03 10:18:28 得分 0
TheAres(班门斧)兄:
那我還要生成xml文件才行嗎?小弟還是有點疑惑,請大哥指點!Top
5 楼confucian(唱反调的男人)回复于 2003-07-03 10:24:37 得分 1
让每一个menuitem加一个事件,可以对应到同一个处理方法
然后在方法里面根据sender的属性判断是哪一个对象触发的,做出不同的处理Top
6 楼confucian(唱反调的男人)回复于 2003-07-03 10:25:29 得分 1
这样无论是用for还是while来添加menuitem都可以
不一定非要用数组Top
7 楼NiuNiuTZ(风满袖)回复于 2003-07-03 10:36:16 得分 0
不是每個MenuItem都要加事件,只有最終的菜單項(相當與樹的葉子節點)才有click事件的Top
8 楼confucian(唱反调的男人)回复于 2003-07-03 10:47:57 得分 1
这个你自己判断哪个加哪个不加就好了
如果要加就写一句,例如:
###.Click+=new EventHandler(event_Handler);
然后下面有一个方法来处理:
private void event_Handler(object sender, System.EventArgs e)
{
try
{
ImgControl ic=(ImgControl)sender;
switch(ic.Text)
{
case:...
}
}
catch
{
...
}
}Top
9 楼confucian(唱反调的男人)回复于 2003-07-03 10:51:45 得分 20
上面的ImgControl是我自己的东西,你改成MenuItem就可以了
如下:
private void event_Handler(object sender, System.EventArgs e)
{
try
{
MenuItem mi=(MenuItem)sender;
switch(mi.Text)
{
case:...
}
}
catch
{
...
}
}
Top
10 楼jiezhi(风满袖)回复于 2003-07-03 11:50:40 得分 0
upTop
11 楼NiuNiuTZ(风满袖)回复于 2003-07-06 08:50:42 得分 0
upTop
12 楼xzgtysx(海带)回复于 2003-07-06 10:05:18 得分 0
confucian(唱反调的男人)
同意这个男人哈哈Top
13 楼liduke(天下有雪)回复于 2003-07-06 10:05:45 得分 1
*.Click+=new EventHandler(eventhandle);
Top
14 楼chikinglau(king)回复于 2003-07-06 12:34:16 得分 1
注册事件,
m.Click += new EventHandler(m_click);Top
15 楼jiezhi(风满袖)回复于 2003-07-06 12:50:20 得分 0
看了看 confucian(唱反调的男人) 的做法,感覺可以。Top
16 楼NiuNiuTZ(风满袖)回复于 2003-07-15 11:37:13 得分 0
upTop
17 楼jiezhi(风满袖)回复于 2003-07-15 11:52:12 得分 60
copy的代碼:
//創建第一級菜單
public static void MakeMenuItem(ref System.Windows.Forms.MainMenu MainMenu,string strUserName,string strDeptNo)
{
MainMenu.MenuItems.Clear();
MenuItem m = new MenuItem();
string strSQL = "SELECT distinct y.mkbm,y.mkmc,y.sjmkbm,y.sfzjd FROM "
+ "(select a.js,b.mkbm from b_czryjs a inner join b_qxqd b on a.js=b.js "
+ "where a.yhm='"+strUserName+"' and a.bmbh='"+strDeptNo+"')x,b_mkqd y "
+ "where x.mkbm=y.mkbm and y.sjmkbm = 0 order by y.mkbm";
SqlDataReader dr = SystemClass.SelectData(strSQL);
while (dr.Read())
{
GenMenuItem(ref MainMenu,strUserName,strDeptNo,dr.GetString(1),m,dr.GetInt32(0),dr.GetBoolean(3));
}
}
//創建相對應下級菜單
public static void GenMenuItem(ref System.Windows.Forms.MainMenu MainMenu,string strUserName,string strDeptNo,string Mkmc,MenuItem m0,int iniMkbm,bool leaf)
{
MenuItem m=new MenuItem();
m.Text=Mkmc;
if (iniMkbm.ToString().Length==4)
{
MainMenu.MenuItems.Add(m);
}
else
{
m0.MenuItems.Add(m);
if (leaf)
{
m.Click+=new EventHandler(event_Handler);
}
}
string mySql="SELECT distinct y.mkbm,y.mkmc,y.sjmkbm,y.sfzjd FROM "+
"(select a.js,b.mkbm from b_czryjs a inner join b_qxqd b on a.js=b.js "+
"where a.yhm='"+strUserName+"' and a.bmbh='"+strDeptNo+"')x,b_mkqd y "+
"where x.mkbm=y.mkbm and y.sjmkbm="+iniMkbm+" order by y.mkbm";
SqlDataReader myDataReader= SystemClass.SelectData(mySql);
while (myDataReader.Read())
{
GenMenuItem(ref MainMenu,strUserName,strDeptNo,myDataReader.GetString(1),m,myDataReader.GetInt32(0),myDataReader.GetBoolean(3));
}
myDataReader.Close();
}
//菜單事件
public static void event_Handler(object sender, System.EventArgs e)
{
MenuItem thisMenu=(MenuItem)sender;
string strSql = " select MKBM from B_MKQD where MKMC = '"+thisMenu.Text+"'";
SqlCommand cmd = new SqlCommand();
cmd.Connection = SystemClass.GetConneciton();
cmd.CommandText = strSql;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds,"T");
//OYAMA.GUI為命名空間
string strMKBM = "OYAMA.GUI.Frm"+ds.Tables["T"].Rows[0]["MKBM"].ToString();
testshowForm(strMKBM.Trim());
}
//顯示窗體
public static void testshowForm(string typeName)
{
//try
//{
Form frm = (Form)Activator.CreateInstance(Type.GetType(typeName));
frm.ShowDialog();
//}
//catch
//{
// MessageBox.Show("沒有找到相對應的模塊","系統提示");
//}
}
Top
18 楼jiezhi(风满袖)回复于 2003-07-15 11:55:16 得分 7
就是要注意的是:窗體的命名為:Frm+模塊編號Top
19 楼brightheroes(在地狱中仰望天堂)回复于 2003-07-15 11:55:49 得分 1
给你动态生成的菜单加上一个click事件就可以了Top
20 楼lht0530(罗洪涛)回复于 2003-07-15 11:58:46 得分 1
*.Click+=new System.EventHandler(*_click);Top




