请问一问题:怎么处理动态生成的菜单的不同事件?

//代码如下:
//--------------------------
using System;
using System.Collections;
using System.Windows.Forms;
using System.Xml;
using System.Drawing;
using System.ComponentModel;
using System.Data;
using System.Reflection;

namespace WinTmp
{

public class MenuCreat
{
string _sXmlFile;
string _sMenuName;
private Form _attachedForm;
System.Collections.Hashtable myHash = new System.Collections.Hashtable();

public MenuCreat(Form aForm)
{
//
// TODO: 在此处添加构造函数逻辑
//
_attachedForm = aForm;
//MessageBox.Show((aForm.GetType()).ToString());
}

public string MenuName
{
get
{
return _sMenuName;
}
set
{
_sMenuName = value;
}
}

public string XmlFile
{
get
{
return _sXmlFile;
}
set
{
_sXmlFile = value;
}
}

public MenuItem[] CreateMenuItems()
{

XmlDocument _oDoc = new XmlDocument( );
_oDoc.Load( _sXmlFile );

XmlNodeList _oMainMenu = _oDoc.DocumentElement.ChildNodes;

MenuItem[] _oMenuItems = new MenuItem[ _oMainMenu.Count ];

int i = 0;
foreach ( XmlElement element in _oMainMenu )
{
_oMenuItems[ i++ ] = ProcessMenuItem( element );
}

return _oMenuItems;
}

private MenuItem ProcessMenuItem(XmlElement inXmlElement)
{
string menuName = inXmlElement.Attributes["Name"].InnerXml;
if ( menuName.IndexOf("&") != -1 )
menuName = menuName.Replace("&", "&");
string menuChecked = inXmlElement.Attributes["Checked"].InnerXml;
string menuRadio = inXmlElement.Attributes["Radio"].InnerXml;
string menuEnabled = inXmlElement.Attributes["Enabled"].InnerXml;
string _onclick = inXmlElement.Attributes["OnClick"].InnerXml;

myHash.Add(menuName,_onclick);

//如何处理事件?请指教
MenuItemEX _oParentMenu = new MenuItemEX(menuName, new EventHandler( SelectMenuItem ) );
//MenuItem _oParentMenu = new MenuItem(menuName);

if ( menuChecked == "True" )
_oParentMenu.Checked = true;
if ( menuEnabled == "False" )
_oParentMenu.Enabled = false;
if ( menuRadio == "True" )
_oParentMenu.RadioCheck = true;

XmlNodeList _oNodes = inXmlElement.ChildNodes;

if ( _oNodes.Count > 0 )
{
MenuItem[] menuItems = new MenuItem[ _oNodes.Count ];
int i = 0 ;
foreach ( XmlElement node in _oNodes )
{
menuItems[i] = ProcessMenuItem( node);
if ( menuItems[i] != null)
_oParentMenu.MenuItems.Add(menuItems[i]);
i++;
}
}

return _oParentMenu;

}

public void SelectMenuItem(object sender, EventArgs e)
{
if (typeof(MenuItemEX).IsInstanceOfType(sender))
{

MenuItemEX item = (MenuItemEX)sender;
string myclick = myHash[item.Text].ToString();

Type myT = _attachedForm.GetType();

MethodInfo[] x = myT.GetMethods();

foreach (MethodInfo xtemp in x)
{
if (myclick.ToLower() == (xtemp.ToString().Trim().ToLower()))
{
xtemp.Invoke(this._attachedForm,null);

}

}

}
}

}

public class MenuItemEX : MenuItem
{
EventHandler clickHandler = null;

public EventHandler ClickHandler
{
set
{
clickHandler = value;
}
get
{
return clickHandler;
}
}

public MenuItemEX()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public MenuItemEX( string name, EventHandler handler ):base( name, handler )
{
Initialize( handler );
}

public MenuItemEX( string name):base( name)
{
//Initialize( handler );
}

private void Initialize( EventHandler handler )
{

clickHandler = handler;
}
}

public class Form1 : System.Windows.Forms.Form
{

public string myName = null;

public string MyName
{
get
{
return myName;
}
set
{
myName = value;
}
}

///

1<summary>   
2/// 必需的设计器变量。   
3/// </summary>

private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
this.Menu = new MainMenu(CreateMenu());
}

///

1<summary>   
2/// 清理所有正在使用的资源。   
3/// </summary>

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

#region Windows Form Designer generated code
///

1<summary>   
2/// 设计器支持所需的方法 - 不要使用代码编辑器修改   
3/// 此方法的内容。   
4/// </summary>

private void InitializeComponent()
{
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "Form1";
this.Text = "Form1";

}
#endregion

private MenuItem[] CreateMenu()
{
string _sXmlFile;
_sXmlFile = Application.StartupPath + @"\Menu.xml";

MenuCreat menu = new MenuCreat(this);

menu.XmlFile = _sXmlFile;

MenuItem[] menuItems = menu.CreateMenuItems();
return menuItems;
}

///

1<summary>   
2/// 应用程序的主入口点。   
3/// </summary>

[STAThread]
public static void Main()
{
Form1 mainForm = new Form1();
//mainForm.Menu = new MainMenu(CreateMenu());
Application.Run(mainForm);
}

public void newclick()
{
MessageBox.Show("New Click");
}

public void openclick()
{
MessageBox.Show("Open Click");
}

public void closeclick()
{
MessageBox.Show("close Click");
}

}

}
//代码结束
---------------------------------------------------------------

XML文件如下:

1<mainmenu>
2<menu checked="False" enabled="True" formname="form2" name="&amp;File" onclick="File_Click" openform="Form2" radio="False">
3<menu checked="False" enabled="False" formname="form2" name="&amp;New" onclick="Void newclick()" openform="Form2" radio="False"></menu>
4<menu checked="False" enabled="True" formname="form2" name="&amp;Open" onclick="Void openclick()" openform="Form2" radio="False"></menu>
5<menu checked="False" enabled="True" formname="form2" name="&amp;Close" onclick="Void closeclick()" openform="Form2" radio="False"></menu>
6</menu>
7</mainmenu>

上面是一个根据XML文件来动态生成菜单的例子,你自己修改一下。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus