C#根据数据库动态生成菜单,菜单单击事件不成功

welcome520 2017-08-15 09:44:52
从网上找的方法,根据数据库动态生成菜单,菜单能成功生成,但单击事件无反应,请大神看一下,错在哪里?

// --------------------------
//P_PrivilegeID_N-唯一标识值
//P_PrivilegeParent_N-菜单项目的父ID,如果是顶级菜单则为0
//P_Name_S-该菜单项在窗体中的控件名称
//P_ShowName_S-该菜单项显示名称
//P_Code_S-该菜单项目要招待的事件名称,带括号,例如:toolStripButton1_Click()
//--------------------------
//这些字段是必需的,其他的就要根据你的实际情况而定了。
//2、在窗体中拖放一个MenuStrip控件,名称为MainMenu1
//3、在窗体代码的FORM_LOAD中加入以下语句:CreateMenu();
//当然如果情况特殊,也可以在别的地方加入该句代码,视实际情况自己决定。
//4、在相关窗体代码中加入以下构造函数
DataTable menuTable;
public void CreateMenu()
{

//取所有菜单项的语句,如果有权限限制等情况自行修改
String menuSql = "select * from Privilege";
//取得菜单项数据集
DataSet ds = SQLHelper.GetDataSet(menuSql);
menuTable=ds.Tables[0];
//检查判断DataSet数据是否完整
if (CheckData(ds))
{
//加载MenuStrip菜单
ToolStripMenuItem topMenu = new ToolStripMenuItem();
LoadSubMenu(ref topMenu, "0");
}

}
/// <summary>
/// 递归创建MenuStrip菜单(模块列表)
/// </summary>
/// <param name="topMenu">父菜单项</param>
/// <param name="FATHER_ID">父菜单的ID</param>
private void LoadSubMenu(ref ToolStripMenuItem topMenu, String inFatherId)
{
DataView dvList = new DataView(menuTable);
//过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
dvList.RowFilter = "P_PrivilegeParent_N=" + inFatherId ;
ToolStripMenuItem subMenu;
foreach (DataRowView dv in dvList)
{
//创建子菜单项
subMenu = new ToolStripMenuItem();
subMenu.Name = dv["P_Name_S"].ToString();
subMenu.Text = dv["P_ShowName_S"].ToString();
//判断是否为顶级菜单
if (inFatherId == "0")
{
MainMenu1.Items.Add(subMenu);
}
else
{
subMenu.Tag = dv["P_Code_S"].ToString();
String str = " void " + dv["P_Code_S"].ToString();
//给菜单项加事件。
subMenu.Click += new EventHandler(subMenu_Click);
topMenu.DropDownItems.Add(subMenu);
}
//递归调用
LoadSubMenu(ref subMenu, dv["P_PrivilegeID_N"].ToString());
}
}

/**/
/// <summary>
/// 菜单单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void subMenu_Click(object sender, EventArgs e)
{
try
{
//tag属性在这里有用到。
string acName = ((ToolStripMenuItem)sender).Tag.ToString();

if (acName != "")
{
string[] strArray = acName.Split(new char[] { ',' });
if (strArray.Length > 2)
{
}
else
{
String str = "void " + acName;
foreach (MethodInfo info in base.GetType().GetMethods())
{
if (str.Trim().ToLower().CompareTo(info.ToString().Trim().ToLower()) == 0) // 调试时,发现怎么也不会相等。
{
info.Invoke(this, null);
}
}
}
}
}
catch (Exception exception)
{
}
}
//检查判断DataSet数据是否完整
public static bool CheckData(DataSet inData)
{
bool flag = false;
if (CheckTable(inData))
{
for (int i = 0; i < inData.Tables.Count; i++)
{
if (inData.Tables[0].Rows.Count > 0) //因为Tables[0]就是第一张表的意思
{
flag = true;
}

}
return flag;
}
return false;
}
public static bool CheckTable(DataSet inData)
{
if (inData == null)
{
return false;
}
return (inData.Tables.Count > 0);
}



请大神指导,我菜单单击事件总是不成功,没反应
...全文
240 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2017-08-16
  • 打赏
  • 举报
回复
base应该是当前类的父类对象,从父类中找方法 info.Invoke(this, null); 这参数真的不明白 ==> 找下父类中这些方法是如何定义的,有些什么参数
welcome520 2017-08-15
  • 打赏
  • 举报
回复
主要是这两句,我看不懂: foreach (MethodInfo info in base.GetType().GetMethods()) //base是干什么的,怎么出来的 info.Invoke(this, null); 这参数真的不明白
  • 打赏
  • 举报
回复
既然不想等,那么你分析各自的数据是怎么“变”出来地呗。总不能是电脑随机产生的吧?!
welcome520 2017-08-15
  • 打赏
  • 举报
回复
//P_Code_S-该菜单项目要招待的事件名称,带括号,例如: 用户管理_Click() private void 用户管理_Click(object sender, EventArgs e) { GVar.msgbox("2"); }

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧