高分求一解决方案:配置菜单 1.使用一个XML文件配置功能菜单2.在一个WINFORM上有一个下拉框,下拉框中显示所有配置的菜单3.选择一个菜单能进入相应的窗口我知道这对于大虾们来说,是很简单的! 但小弟不会! 往大虾们指点一下!谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using System.Xml;using OutLookBar;using VivantLabs;namespace Menu{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.CreateMenu();//加载置顶菜单信息 this.outLookBarInit();//加载左菜单信息 } #region 创建置顶菜单项 /// <summary> /// 动态创建菜单 /// </summary> /// <param name="FilePath">菜单XML文件的路径</param> public void CreateMenu() { //定义一个主菜单 MenuStrip mainMenu = new MenuStrip(); //设置主菜单的位置 mainMenu.Parent = this.panel1; mainMenu.Dock = DockStyle.Fill; //定义一个Dataset保存读取的Xml文件 DataSet ds = new DataSet(); //读取Xml数据 if (!File.Exists(Application.StartupPath + @"\Menu.xml")) { MessageBox.Show("配置文件不存在!","系统提示"); return; } ds.ReadXml(Application.StartupPath + @"\Menu.xml"); //赋值给DataView DataView dv = ds.Tables[0].DefaultView; this.dataGridView1.DataSource = dv;//测试 //通过DataView来过滤数据并最先得到最顶层的菜单项 dv.RowFilter = "ParentItemID=0"; for (int i = 0; i < dv.Count; i++) { //创建一个菜单项 ToolStripMenuItem topMenu = new ToolStripMenuItem(); //给菜单赋Text值。也就是在界面上看到的值。 topMenu.Text = dv[i]["Text"].ToString(); // 添加退出事件 if ("退出".Equals(dv[i]["Text"].ToString())) { topMenu.Click += new EventHandler(topMenu_Click); } //如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单 if (Convert.ToInt16(dv[i]["IsModule"]) == 1) { //以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。--也许还有更好的方法^_^. CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["ItemID"]), ds.Tables[0]); } //显示应用程序中已打开的 MDI 子窗体列表的菜单项 mainMenu.MdiWindowListItem = topMenu; //将递归附加好的菜单加到菜单根项上。 mainMenu.Items.Add(topMenu); } mainMenu.Dock = DockStyle.Top; //将窗体的MainMenuStrip梆定为mainMenu. this.MainMenuStrip = mainMenu; //这句很重要。如果不写这句菜单将不会出现在主窗体中。 this.Controls.Add(mainMenu); } /// <summary> /// 创建子菜单 /// </summary> /// <param name="topMenu">父菜单项</param> /// <param name="ItemID">父菜单的ID</param> /// <param name="dt">所有菜单数据集</param> private void CreateSubMenu(ref ToolStripMenuItem topMenu, int ItemID, DataTable dt) { DataView dv = new DataView(dt); //过滤出当前父菜单下在所有子菜单数据(仅为下一层的) dv.RowFilter = "ParentItemID=" + ItemID.ToString(); for (int i = 0; i < dv.Count; i++) { //创建子菜单项 ToolStripMenuItem subMenu = new ToolStripMenuItem(); subMenu.Text = dv[i]["Text"].ToString(); //如果还有子菜单则继续递归加载。 if (Convert.ToInt16(dv[i]["IsModule"]) == 1) { //递归调用 CreateSubMenu(ref subMenu, Convert.ToInt32(dv[i]["ItemID"]), dt); } else { //扩展属性可以加任何想要的值。这里用formName属性来加载窗体。 //给没有子菜单的菜单项加事件。 if ("记事本".Equals(dv[i]["Text"].ToString())) { subMenu.Tag = "Notepad"; subMenu.Click += new EventHandler(OtherTools_Click); } else if ("画图".Equals(dv[i]["Text"].ToString())) { subMenu.Tag = "MsPaint"; subMenu.Click += new EventHandler(OtherTools_Click); } else if ("操作助手".Equals(dv[i]["Text"].ToString())) { subMenu.Tag = "Assistant"; subMenu.Click += new EventHandler(OtherTools_Click); } else if ("计算器".Equals(dv[i]["Text"].ToString())) { subMenu.Tag = "Calc"; subMenu.Click += new EventHandler(OtherTools_Click); } else { subMenu.Tag = dv[i]["FormName"].ToString(); subMenu.Click += new EventHandler(subMenu_Click); } } if (dv[i]["ImageName"].ToString().Length > 0) { //设置菜单项前面的图票为16X16的图片文件。 Image img = Image.FromFile(@"..\..\Image\" + dv[i]["ImageName"].ToString()); subMenu.Image = img; subMenu.Image.Tag = dv[i]["ImageName"].ToString(); } //将菜单加到顶层菜单下。 topMenu.DropDownItems.Add(subMenu); } } /// <summary> /// 菜单单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void subMenu_Click(object sender, EventArgs e) { //tag属性在这里有用到。 string formName = ((ToolStripMenuItem)sender).Tag.ToString(); CreateFormInstance(formName); } //其它工具菜单事件的注册方法 private void OtherTools_Click(object sender, EventArgs e) { switch (((ToolStripMenuItem)(sender)).Tag.ToString()) { case "Calc": //计算器 { System.Diagnostics.Process.Start("Calc.exe"); break; } case "Notepad": //记事本 { System.Diagnostics.Process.Start("Notepad.exe"); break; } case "MsPaint": //画图 { System.Diagnostics.Process.Start("MsPaint.exe"); break; } case "Assistant": { MessageBox.Show("帮助文件正在制作中,感谢您的使用!!!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); break; } } } /// <summary> /// 退出菜单单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void topMenu_Click(object sender, EventArgs e) { if (MessageBox.Show("您确实要退出系统吗?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { this.Dispose(); Application.Exit(); GC.Collect(); } } /// <summary> /// 创建form实例。 /// </summary> /// <param name="formName">form的类名</param> private void CreateFormInstance(string formName) { bool flag = false; //遍历主窗口上的所有子菜单 for (int i = 0; i < this.MdiChildren.Length; i++) { //如果所点的窗口被打开则重新激活 if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower()) { this.MdiChildren[i].Activate(); this.MdiChildren[i].Show(); this.MdiChildren[i].WindowState = FormWindowState.Normal; flag = true; break; } } if (!flag) { this.pnlMain.Controls.Clear(); string formstring = @"Menu" + @"." + formName;//系统中窗体的名称 Type t = Type.GetType(formstring); object obj = System.Activator.CreateInstance(t); Form f = (Form)obj; f.TopLevel = false; f.Parent = this.pnlMain; f.Dock = DockStyle.Fill; f.Show(); } } #endregion #region 初始化LookOutBar /// <summary> /// 初始化LookOutBar /// </summary> private void outLookBarInit() { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Application.StartupPath + "\\MTMenu.xml"); XmlNode root = xmlDoc.SelectSingleNode("Menus"); XmlNodeList divlist = root.ChildNodes; int divcount = divlist.Count; for (int i = 0; i < divcount; i++) { OutLookWrapper m_OLW = new OutLookWrapper(); m_OLW.Text = divlist[i].Attributes["Name"].Value.ToString(); XmlNodeList buttonlist = divlist[i].ChildNodes; int buttoncount = buttonlist.Count; for (int j = 0; j < buttoncount; j++) { OutLookRow m_OLR = new OutLookRow(); m_OLR.Icon = new Icon(buttonlist[j].ChildNodes.Item(2).InnerText); m_OLR.Text = buttonlist[j].ChildNodes.Item(0).InnerText; string formname = buttonlist[j].ChildNodes.Item(1).InnerText; m_OLR.FormName = formname; ButtonClicked a = new ButtonClicked(clickedOpenForm); m_OLR.SetAction(a); m_OLW.AddRow(m_OLR); } m_OLW.Mode = ViewMode.Large_Icons; this.outLookBar1.AddRow(m_OLW); } } #endregion #region 左菜单 /// <summary> ///左菜单 /// </summary> /// <param name="formname"></param> private void clickedOpenForm(string formname) { } #endregion }} menu.xml<?xml version="1.0" encoding="utf-8" ?><Menus> <MenuItem> <Text>VIP储值卡管理</Text> <ItemID>101</ItemID> <ParentItemID>0</ParentItemID> <FormName></FormName> <IsModule>1</IsModule> <Level>0</Level> <ImageName></ImageName> </MenuItem> <MenuItem> <Text>VIP储值卡写卡</Text> <ItemID>101001</ItemID> <ParentItemID>101</ParentItemID> <FormName>CardRF001</FormName> <IsModule>0</IsModule> <Level>0</Level> <ImageName></ImageName> </MenuItem> <MenuItem> <Text>VIP储值卡换卡</Text> <ItemID>101002</ItemID> <ParentItemID>101</ParentItemID> <FormName>CardRF002</FormName> <IsModule>0</IsModule> <Level>0</Level> <ImageName></ImageName> </MenuItem> <MenuItem> <Text>VIP储值卡挂失</Text> <ItemID>101003</ItemID> <ParentItemID>101</ParentItemID> <FormName>CardRF003</FormName> <IsModule>0</IsModule> <Level>0</Level> <ImageName></ImageName> </MenuItem> <MenuItem> <Text>VIP储值卡注销</Text> <ItemID>101004</ItemID> <ParentItemID>101</ParentItemID> <FormName>CardRF004</FormName> <IsModule>0</IsModule> <Level>0</Level> <ImageName></ImageName> </MenuItem> <MenuItem> <Text>挂帐管理</Text> <ItemID>108</ItemID> <ParentItemID>0</ParentItemID> <FormName></FormName> <IsModule>1</IsModule> <Level>0</Level> <ImageName></ImageName> </MenuItem>...... outlookbar这个dll你可以到网上搜下,然后引用它,或者不用它,测试下功能,是可用的 string formstring = @"Menu" + @"." + formName;//系统中窗体的名称Type t = Type.GetType(formstring);object obj = System.Activator.CreateInstance(t);上面一段怎么解释呀!? 我的在这里运行不成功! 其中的t是NULL.当然,我也不是使用MenuStrip 的方式.我只是将菜单加载到一个COMBOBOX中,COMBOBOX的DISPLAYMEMBER是TEXT,COMBOBOX的VALUEMEMBER是FORMNAME. 结果我在SELECTEDINDEXCHANGE事件中,将取到的COMBOBOX.SELECTEDVALUE放到上面代码的formName中就不行! 我也试着将@"Menu" + @"." 去掉. 还是不行!所以我就不明白,这里为什么要加个"MENU."谢谢!!! http://hi.baidu.com/jackeyrain/blog/item/3cb44c180ecf8bbc4bedbc08.html 我顶我顶,我顶顶顶! 不要沉了呀! 在线WAITING... string formstring = "窗体的名称"; 我搞出来了! 哈...不用什么动态添加引用! LOOK下面的代码:Assembly assembly = Assembly.LoadFile(Application.StartupPath + @"\AnotherProject.dll"); object temp = assembly.CreateInstance("AnotherProject.Form1"); Type curType = assembly.GetType("AnotherProject.Form1", false, true); object obj = System.Activator.CreateInstance(curType); Form f = (Form)obj; f.TopLevel = true; f.ShowDialog(); 顺便说一下,如果是同命名空间下的窗体直接调用下面的方法就可以:string formstring1 = @"当前命名空间的名字" + @"." + formName;//系统中窗体的名称 Type t = Type.GetType(formstring); object obj = System.Activator.CreateInstance(t); Form f = (Form)obj; f.TopLevel = true; f.ShowDialog(); WPF datagrid 中datagridcomboboxcolumn的数据绑定与datagrid数据绑定的匹配 如何调用自己封装的类库? 如何使一个List<T>数组可以在不同方法、类里操作访问? vf数据添加字段的问题 WINFORM中程序启动后,默认鼠标位置 InvokeMember方法是怎么使用的阿 请教using语句的使用场合 如何建立一个后台服务自动读取MSMQ中的消息啊,高手请赐教! 怎么设置TOOLBAR按钮的图片? 关于拉姆达表达式 的一个问题 C#.net处理闪烁的问题 项目最后一步。随机问题,高手来解决。。。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using OutLookBar;
using VivantLabs;
namespace Menu
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
this.CreateMenu();//加载置顶菜单信息
this.outLookBarInit();//加载左菜单信息
} #region 创建置顶菜单项
/// <summary>
/// 动态创建菜单
/// </summary>
/// <param name="FilePath">菜单XML文件的路径</param>
public void CreateMenu()
{
//定义一个主菜单
MenuStrip mainMenu = new MenuStrip();
//设置主菜单的位置
mainMenu.Parent = this.panel1;
mainMenu.Dock = DockStyle.Fill;
//定义一个Dataset保存读取的Xml文件
DataSet ds = new DataSet();
//读取Xml数据
if (!File.Exists(Application.StartupPath + @"\Menu.xml"))
{
MessageBox.Show("配置文件不存在!","系统提示");
return;
}
ds.ReadXml(Application.StartupPath + @"\Menu.xml");
//赋值给DataView
DataView dv = ds.Tables[0].DefaultView; this.dataGridView1.DataSource = dv;//测试 //通过DataView来过滤数据并最先得到最顶层的菜单项
dv.RowFilter = "ParentItemID=0";
for (int i = 0; i < dv.Count; i++)
{
//创建一个菜单项
ToolStripMenuItem topMenu = new ToolStripMenuItem();
//给菜单赋Text值。也就是在界面上看到的值。
topMenu.Text = dv[i]["Text"].ToString();
// 添加退出事件
if ("退出".Equals(dv[i]["Text"].ToString()))
{
topMenu.Click += new EventHandler(topMenu_Click);
}
//如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单
if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
{
//以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。--也许还有更好的方法^_^.
CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["ItemID"]), ds.Tables[0]);
}
//显示应用程序中已打开的 MDI 子窗体列表的菜单项
mainMenu.MdiWindowListItem = topMenu;
//将递归附加好的菜单加到菜单根项上。
mainMenu.Items.Add(topMenu);
}
mainMenu.Dock = DockStyle.Top;
//将窗体的MainMenuStrip梆定为mainMenu.
this.MainMenuStrip = mainMenu;
//这句很重要。如果不写这句菜单将不会出现在主窗体中。
this.Controls.Add(mainMenu);
} /// <summary>
/// 创建子菜单
/// </summary>
/// <param name="topMenu">父菜单项</param>
/// <param name="ItemID">父菜单的ID</param>
/// <param name="dt">所有菜单数据集</param>
private void CreateSubMenu(ref ToolStripMenuItem topMenu, int ItemID, DataTable dt)
{
DataView dv = new DataView(dt);
//过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
dv.RowFilter = "ParentItemID=" + ItemID.ToString();
for (int i = 0; i < dv.Count; i++)
{
//创建子菜单项
ToolStripMenuItem subMenu = new ToolStripMenuItem();
subMenu.Text = dv[i]["Text"].ToString();
//如果还有子菜单则继续递归加载。
if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
{
//递归调用
CreateSubMenu(ref subMenu, Convert.ToInt32(dv[i]["ItemID"]), dt);
}
else
{
//扩展属性可以加任何想要的值。这里用formName属性来加载窗体。
//给没有子菜单的菜单项加事件。
if ("记事本".Equals(dv[i]["Text"].ToString()))
{
subMenu.Tag = "Notepad";
subMenu.Click += new EventHandler(OtherTools_Click);
}
else if ("画图".Equals(dv[i]["Text"].ToString()))
{
subMenu.Tag = "MsPaint";
subMenu.Click += new EventHandler(OtherTools_Click);
}
else if ("操作助手".Equals(dv[i]["Text"].ToString()))
{
subMenu.Tag = "Assistant";
subMenu.Click += new EventHandler(OtherTools_Click);
}
else if ("计算器".Equals(dv[i]["Text"].ToString()))
{
subMenu.Tag = "Calc";
subMenu.Click += new EventHandler(OtherTools_Click);
}
else
{
subMenu.Tag = dv[i]["FormName"].ToString();
subMenu.Click += new EventHandler(subMenu_Click);
}
}
if (dv[i]["ImageName"].ToString().Length > 0)
{
//设置菜单项前面的图票为16X16的图片文件。
Image img = Image.FromFile(@"..\..\Image\" + dv[i]["ImageName"].ToString());
subMenu.Image = img;
subMenu.Image.Tag = dv[i]["ImageName"].ToString();
}
//将菜单加到顶层菜单下。
topMenu.DropDownItems.Add(subMenu);
}
}
/// <summary>
/// 菜单单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void subMenu_Click(object sender, EventArgs e)
{
//tag属性在这里有用到。
string formName = ((ToolStripMenuItem)sender).Tag.ToString();
CreateFormInstance(formName); } //其它工具菜单事件的注册方法
private void OtherTools_Click(object sender, EventArgs e)
{
switch (((ToolStripMenuItem)(sender)).Tag.ToString())
{
case "Calc": //计算器
{
System.Diagnostics.Process.Start("Calc.exe");
break;
}
case "Notepad": //记事本
{
System.Diagnostics.Process.Start("Notepad.exe");
break;
}
case "MsPaint": //画图
{
System.Diagnostics.Process.Start("MsPaint.exe");
break;
}
case "Assistant":
{
MessageBox.Show("帮助文件正在制作中,感谢您的使用!!!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
break;
}
}
} /// <summary>
/// 退出菜单单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void topMenu_Click(object sender, EventArgs e)
{
if (MessageBox.Show("您确实要退出系统吗?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
this.Dispose();
Application.Exit();
GC.Collect();
}
} /// <summary>
/// 创建form实例。
/// </summary>
/// <param name="formName">form的类名</param>
private void CreateFormInstance(string formName)
{ bool flag = false;
//遍历主窗口上的所有子菜单
for (int i = 0; i < this.MdiChildren.Length; i++)
{
//如果所点的窗口被打开则重新激活
if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower())
{
this.MdiChildren[i].Activate();
this.MdiChildren[i].Show();
this.MdiChildren[i].WindowState = FormWindowState.Normal;
flag = true;
break;
}
}
if (!flag)
{
this.pnlMain.Controls.Clear();
string formstring = @"Menu" + @"." + formName;//系统中窗体的名称
Type t = Type.GetType(formstring);
object obj = System.Activator.CreateInstance(t);
Form f = (Form)obj;
f.TopLevel = false;
f.Parent = this.pnlMain;
f.Dock = DockStyle.Fill;
f.Show();
}
} #endregion
#region 初始化LookOutBar
/// <summary>
/// 初始化LookOutBar
/// </summary>
private void outLookBarInit()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Application.StartupPath + "\\MTMenu.xml");
XmlNode root = xmlDoc.SelectSingleNode("Menus");
XmlNodeList divlist = root.ChildNodes;
int divcount = divlist.Count;
for (int i = 0; i < divcount; i++)
{
OutLookWrapper m_OLW = new OutLookWrapper();
m_OLW.Text = divlist[i].Attributes["Name"].Value.ToString();
XmlNodeList buttonlist = divlist[i].ChildNodes;
int buttoncount = buttonlist.Count;
for (int j = 0; j < buttoncount; j++)
{
OutLookRow m_OLR = new OutLookRow();
m_OLR.Icon = new Icon(buttonlist[j].ChildNodes.Item(2).InnerText);
m_OLR.Text = buttonlist[j].ChildNodes.Item(0).InnerText;
string formname = buttonlist[j].ChildNodes.Item(1).InnerText;
m_OLR.FormName = formname;
ButtonClicked a = new ButtonClicked(clickedOpenForm);
m_OLR.SetAction(a);
m_OLW.AddRow(m_OLR);
}
m_OLW.Mode = ViewMode.Large_Icons;
this.outLookBar1.AddRow(m_OLW);
}
}
#endregion #region 左菜单
/// <summary>
///左菜单
/// </summary>
/// <param name="formname"></param>
private void clickedOpenForm(string formname)
{
}
#endregion }
}
<Menus>
<MenuItem>
<Text>VIP储值卡管理</Text>
<ItemID>101</ItemID>
<ParentItemID>0</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>0</Level>
<ImageName></ImageName>
</MenuItem>
<MenuItem>
<Text>VIP储值卡写卡</Text>
<ItemID>101001</ItemID>
<ParentItemID>101</ParentItemID>
<FormName>CardRF001</FormName>
<IsModule>0</IsModule>
<Level>0</Level>
<ImageName></ImageName>
</MenuItem>
<MenuItem>
<Text>VIP储值卡换卡</Text>
<ItemID>101002</ItemID>
<ParentItemID>101</ParentItemID>
<FormName>CardRF002</FormName>
<IsModule>0</IsModule>
<Level>0</Level>
<ImageName></ImageName>
</MenuItem>
<MenuItem>
<Text>VIP储值卡挂失</Text>
<ItemID>101003</ItemID>
<ParentItemID>101</ParentItemID>
<FormName>CardRF003</FormName>
<IsModule>0</IsModule>
<Level>0</Level>
<ImageName></ImageName>
</MenuItem>
<MenuItem>
<Text>VIP储值卡注销</Text>
<ItemID>101004</ItemID>
<ParentItemID>101</ParentItemID>
<FormName>CardRF004</FormName>
<IsModule>0</IsModule>
<Level>0</Level>
<ImageName></ImageName>
</MenuItem>
<MenuItem>
<Text>挂帐管理</Text>
<ItemID>108</ItemID>
<ParentItemID>0</ParentItemID>
<FormName></FormName>
<IsModule>1</IsModule>
<Level>0</Level>
<ImageName></ImageName>
</MenuItem>
...
...
Type t = Type.GetType(formstring);
object obj = System.Activator.CreateInstance(t);上面一段怎么解释呀!? 我的在这里运行不成功! 其中的t是NULL.
当然,我也不是使用MenuStrip 的方式.我只是将菜单加载到一个COMBOBOX中,COMBOBOX的DISPLAYMEMBER是TEXT,COMBOBOX的VALUEMEMBER是FORMNAME. 结果我在SELECTEDINDEXCHANGE事件中,将取到的COMBOBOX.SELECTEDVALUE放到上面代码的formName中就不行! 我也试着将@"Menu" + @"." 去掉. 还是不行!所以我就不明白,这里为什么要加个"MENU."谢谢!!!
不用什么动态添加引用! LOOK下面的代码:Assembly assembly = Assembly.LoadFile(Application.StartupPath + @"\AnotherProject.dll"); object temp = assembly.CreateInstance("AnotherProject.Form1"); Type curType = assembly.GetType("AnotherProject.Form1", false, true); object obj = System.Activator.CreateInstance(curType);
Form f = (Form)obj;
f.TopLevel = true;
f.ShowDialog();
Type t = Type.GetType(formstring);
object obj = System.Activator.CreateInstance(t);
Form f = (Form)obj;
f.TopLevel = true;
f.ShowDialog();