使用递归加载无层次限制的MainMenu控件的MenuItem

主菜單代碼:

using  System;
using  System.Collections;
using  System.ComponentModel;
using  System.Drawing;
using  System.Data;
using  System.Windows.Forms;
using  System.Reflection;

namespace  ChenYueJun.WindowsControlLibrary
{
    
/// <summary>
    
/// CYJ_MainMenu 的摘要描述。
    
/// </summary>

    public class CYJ_MainMenu : System.Windows.Forms.MainMenu 
    
{
        
/// <summary>
        
/// 設計工具所需的變數。
        
/// </summary>

        private System.ComponentModel.Container components = null;
        
增加屬性

        
重載

        
/// <summary>
        
/// 清除任何使用中的資源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if( components != null )
                    components.Dispose();
            }

            
base.Dispose( disposing );
        }

        
動態增加主菜單的菜單項

        
///   -----------------------------------------------------------------------------
        
///   <summary>
        
///   依据菜单名称返回菜单对象
        
///   </summary>
        
///   <param   name="FormIstance">窗体实例</param>
        
///   <param   name="MenuItemName">菜单名称</param>
        
///   <returns>菜单</returns>
        
///   <remarks>
        
///   </remarks>
        
///   <history>
        
///   [lzmtw] 2005-10-21 Created
        
///   </history>
        
///   -----------------------------------------------------------------------------

        private MenuItem GetMenuItemByName(Form FormIstance, string MenuItemName)
        
{
            System.Reflection.BindingFlags FindBinding;
            FindBinding 
= BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
            System.Reflection.FieldInfo MenuItemFieldInfo;
            MenuItemFieldInfo 
= FormIstance.GetType().GetField("_" + MenuItemName, FindBinding);
            
if (MenuItemFieldInfo == null)
            
{
                
return null;
            }

            
else
            
{
                
return ((MenuItem) MenuItemFieldInfo.GetValue(FormIstance));
            }

        }

        
        
///   -----------------------------------------------------------------------------
        
///   <summary>
        
///   给出菜单对象返回菜单名称
        
///   </summary>
        
///   <param   name="FormIstance">窗体实例</param>
        
///   <param   name="MenuItem">菜单</param>
        
///   <returns>菜单名称</returns>
        
///   <remarks>
        
///   </remarks>
        
///   <history>
        
///   [lzmtw] 2005-10-21 Created
        
///   </history>
        
///   -----------------------------------------------------------------------------

        private string GetMenuItemName(Form FormIstance, MenuItem MenuItem)
        
{
            System.Reflection.BindingFlags FindBinding;
            FindBinding 
= BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
            System.Reflection.FieldInfo MenuItemFieldInfo;
            
foreach (System.Reflection.FieldInfo tempLoopVar_MenuItemFieldInfo in FormIstance.GetType().GetFields(FindBinding))
            
{
                MenuItemFieldInfo 
= tempLoopVar_MenuItemFieldInfo;
                
if (MenuItemFieldInfo.GetValue(FormIstance) == MenuItem)
                
{
                    
return MenuItemFieldInfo.Name.Substring(1);
                }

            }

            
return string.Empty;
        }

    }

}

菜單項代碼:

 

using  System;
using  System.Collections;
using  System.ComponentModel;
using  System.Drawing;
using  System.Data;
using  System.Windows.Forms;

namespace  ChenYueJun.WindowsControlLibrary
{
    
/// <summary>
    
/// CYJ_MenuItem 的摘要描述。
    
/// </summary>

    public class CYJ_MenuItem : System.Windows.Forms.MenuItem 
    
{
        
/// <summary>
        
/// 設計工具所需的變數。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        
增加屬性

        
重載

        
/// <summary>
        
/// 清除任何使用中的資源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if( components != null )
                    components.Dispose();
            }

            
base.Dispose( disposing );
        }


        
遞歸增加子菜單

        
GetShortcut
    }

}

調用方法:

this.mainMenu1.LoadMenuItem(ds.Tables[dataMember],"NodeId","ParentId","NodeName","MenuItem_ShortCut","MenuItem_Mnemonic","NodeIndex",rootTag,new EventHandler(this.menuItem_Click));

有一點不滿意的地方,如何將MenuItem.Name屬性公開,而不用自定義的Name屬性.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值