继承菜单,给它加上你想要的属性如下
sing System;
using System.Windows.Forms;namespace com.uncnet.wl.client
{
/// <summary>
/// 继承MenuItem类,增加Tag属性
/// </summary>
public class uncMenuItem : MenuItem
{
private object tag = "";
private string pID = "";
private string dllName = "";
private string nameSpace = "";
private string libraryName = "";
private string sectionNM = ""; public uncMenuItem( string inMenuItemText )
{
this.Text = inMenuItemText; } public uncMenuItem( )
{ } /// <summary>
/// 获取或设置包含有关uncMenuItem的数据的对象
/// </summary>
public object Tag
{
get
{
return tag;
}
set
{
tag = value;
}
} /// <summary>
/// 获取或设置菜单父ID
/// </summary>
public string PID
{
get
{
return pID;
}
set
{
this.pID = value;
}
} /// <summary>
/// 获取或设置DLL文件名
/// </summary>
public string DllName
{
get
{
return dllName;
}
set
{
this.dllName = value;
}
} /// <summary>
/// 获取或设置Dll的命名空间
/// </summary>
public string NameSpace
{
get
{
return this.nameSpace;
}
set
{
this.nameSpace = value;
}
} /// <summary>
/// 模块英文名
/// </summary>
public string SectionNM
{
get
{
return this.sectionNM;
}
set
{
this.sectionNM = value;
}
} /// <summary>
/// 程序集名称
/// </summary>
public string LibraryName
{
get
{
return this.libraryName;
}
set
{
this.libraryName = value;
}
} }
}

解决方案 »

  1.   

    不用这么费力吧?难道大家平时做都是继承一个??感觉有点大炮打蚊子了,大家平时是怎么做的??
    谢谢 brightheroes(闭关)的答复。
      

  2.   

    我用的笨方法遍历,还有就是TabIndex也可以
      

  3.   

    关注!
    平时我也是像brightheroes(闭关)这种做法的,不过我很想知道有没有其他更简单的方法?
      

  4.   

    具体的权限我们是这样控制的菜单 ---〉权限组 ----〉角色 ---〉用户
    根据用户来动态的生成他拥有的菜单项目至于我的那个类,主要是为了用反射才做的
    顺便加了个tag而已
      

  5.   

    菜单的动态生成:1、使用XML,把你的菜单项存放在XML文件中,然后通过与之相关的权限生成菜单。
    2、使用数据库,与XML的原理一样:)
      

  6.   

    自己继承MenuItem,那么有百十个菜单项的话,可够手工Add的麻烦的!!感觉还不如利用窗体设计器,利用MenuItem的name,从数据库里拉出对应权限角色的所有MenuItem的name,然后遍历整个菜单,name符合的就visable或enable,这样还来的简单方便些,而brightheroes(闭关)老兄的总觉得太累啊!难道没有更好的方法了??
      

  7.   

    你用foreach来做不就ok了
    而且,你在数据库中万一改动了什么地方,你的程序就死定了,肯定要重新写过改动的地方
      

  8.   

    这是生成菜单的,就是从数据库中读出对应的权限菜单来,放进一个datatable中,然后做循环for( int i = 0; i < this.ds.Tables [0].Rows .Count ; i ++ )
    {
    if(this.ds .Tables [0].Rows [i][2].ToString () =="-1") {
    cmdLink = new C1CommandLink();
    cmdMenu = new C1CommandMenu();
    this.c1MainMenu1.CommandLinks.Add( cmdLink );
    this.c1CommandHolder2.Commands.Add( cmdMenu );
    cmdLink.Command = cmdMenu;
    cmdLink.Text = this.ds.Tables [0].Rows [i][4].ToString ();
    cmdMenu.Name = this.ds.Tables [0].Rows [i][1].ToString ();
    cmdMenu.Text = this.ds.Tables [0].Rows [i][4].ToString (); for( int k = 0; k < this.ds.Tables [0].Rows .Count; k ++ )
    {
    if ( this.ds .Tables [0].Rows [k][2].ToString () ==this.ds .Tables [0].Rows [i][0].ToString () )
    {
    cmdLink = new C1CommandLink();
    cmd = new C1Command();
    this.c1CommandHolder2.Commands.Add( cmd );
    cmdLink.Command = cmd;
    cmdLink.Text = this.ds.Tables [0].Rows [k][4].ToString ();
    cmd.Name = this.ds.Tables [0].Rows [k][1].ToString ();
    cmd.Text = this.ds.Tables [0].Rows [k][4].ToString ();
    cmd.Click += new ClickEventHandler( this.c1Command_Click );
    cmdMenu.CommandLinks.Add( cmdLink );
    _index2 ++;
    }
    } _index1 ++;
    }
    }
    应该是用递归的,但是我们的程序没有必要,所以就没有用:)
      

  9.   

    下面是对应的菜单事件
    private void c1Command_Click(object sender, C1.Win.C1Command.ClickEventArgs e)
    {
    try
    {
    this.OpenSection ("com.uncnet.wl."+ e.CallerLink.Command .Name.ToString () ,e.CallerLink.Command .Name.ToString () , e.CallerLink.Text );
    if (e.CallerLink.Text.Trim () != "-")
    {
    this.lblFormName .Text = e.CallerLink.Text;
    }
    }
    catch(Exception ex)
    {
    uncString.ShowWarning ("该功能还没有安装!"+ex.ToString ());
    }
    }
    #region 操作分发
    /// <summary>
    /// 操作分发
    /// </summary>
    /// <param name="inSectionNamespacePrefix">要打开模块的命名空间</param>
    /// <param name="inLibraryName">要打开模块的类名</param>
    /// <param name="inSectionNM">要打开模块的英文名称</param>
    private void OpenSection( string nameSpace , string  section , string action)
    {
    if (action.Trim () == "-") return ;
    foreach ( Control control in this.panel1.Controls )
    {
    if ( control != null )
    control.Dispose();
    }
    try
    {
    Type type = Type.GetType( nameSpace  + ".Portal," + section );
    MethodInfo info = type.GetMethod( "GetPortal" );
    object Portal = Activator.CreateInstance( type );
    object[] args = new object[1];
    args[0] = action;
    Form ShowForm = (Form)info.Invoke( Portal,args );
    ShowForm.TopMost = false;
    ShowForm.TopLevel = false;
    ShowForm.FormBorderStyle = FormBorderStyle.None;
    ShowForm.Dock = DockStyle.Fill;
    this.panel1.Controls.Add( ShowForm );
    ShowForm.Show ();
    this.lblFormName .Text = "";
    }
    catch(Exception ex)
    {
    uncString.ShowWarning ("该功能还没有安装!"+ex.ToString ());

    }
    }
    #endregion 操作分发
      

  10.   

    这样做的好处是升级方便,我就更新dll就可以了,不用动我的exe文件
      

  11.   

    第三方控件。直接用.Net里面的那个MainMenu的话,太不象产品了吧。第三方控件,什么都解决了。
      

  12.   

    .net 的菜单类中也有Tag 属性可用的。
      

  13.   

    Tag属性在那里??好像没发现啊!!
      

  14.   

    to brightheroes(闭关):
    你添加的事件里打开窗体,我想问的是,
    Form ShowForm = (Form)info.Invoke( Portal,args );
    你在这里传递了一个string类型的参数来调用窗体,如果有其他类型的参数呢??
    比如: object[] args = new object[]{string1,string2,new MyClass1[],new MyClass2[]};
    如果是string类型的参数,当然可以纪录在数据库里,但是其他类型的,你怎么办??
      

  15.   

    关注!正在考虑,只不过我门是设计B/S结构的,菜单使用的是JAVASCRIPT!
      

  16.   

    结帖了,还是希望能有更好的方法。
    谢谢各位的参与,谢谢brightheroes(闭关)兄弟。