#【C#学习记录01】C#menu实现历史窗口记录
实现内容:实现窗体在panel容器中加载的历史记录,只要窗口不关闭,不会从容器中移除。
实现过程:
1、窗体设计,如图:通过点击form2和form3将两个窗体加载在panel1中,并且将两个窗体的名称显示在窗口菜单栏下。
代码如下:
1、窗体加载代码:
//加载窗体方法
private void OpenForm(Form form)
{
form.TopLevel = false;
form.WindowState = FormWindowState.Maximized;
form.FormBorderStyle = FormBorderStyle.None;
form.Parent = panel1;
form.Show();
}
//窗体放入容器注意事项:
//窗体关闭后,在添加会报错,所以应该再添加窗体前,进行判断,在进行窗体加载
private Form2 form2 = new Form2();
private void form2ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (panel1.Contains(form2))
{
form2.BringToFront();
return;
}
else if (form2 == null)
{
form2 = new Form2();
}
else if (form2 != null && form2.IsDisposed)
{
form2 = new Form2();
}
OpenForm(form2);
}rp
2、加载历史代码:
//添加历史记录
private void LoadHis()
{
ToolStripMenuItem menue = new ToolStripMenuItem(panel1.Controls[panel1.Controls.Count-1].ToString().Split(':')[1]+"窗体"); //创建菜单对象
WindowToolStripMenuItem.DropDownItems.Insert(WindowToolStripMenuItem.DropDownItems.Count, menue);//向菜单中添加子菜单
switch((panel1.Controls[panel1.Controls.Count - 1].ToString().Split(':')[1] + "窗体").Trim())
{
case "第二个窗体":
menue.Click += new EventHandler(form2ToolStripMenuItem_Click);
break;
case "第三个窗体":
menue.Click += new EventHandler(form3ToolStripMenuItem_Click_1);
break;
}
}
private void panel1_ControlAdded(object sender, ControlEventArgs e)
{
//加载记录
LoadHis();
}
代码中:switch是为了循环添加menu的click事件
3、program中定义了全局变量,以便获得关闭窗口的名称
public static string hisName = string.Empty;
4、获得关闭窗口的名称
private void button1_Click(object sender, EventArgs e)
{
Program.hisName = this.Name;
Close();
}
5、关闭窗体后,需要将记录清除
//panel中移除控件事件
private void panel1_ControlRemoved(object sender, ControlEventArgs e)
{
//历史窗口移除记录
WindowToolStripMenuItem.DropDownItems.RemoveByKey(Program.hisName);
}
6、注意要点:
1、menu按钮通过press方法获取被选中的按钮
2、menu中remove方法删除menu
3、menu添加按钮可以使用add和insert,通过整个案例,在动态添加中,可以使用add,这是因为在remove时。按照insert的key删除,整个menu的key会重新变化,所以使用removebykey的方法,这个方法的参数是按钮的name。
7、未实现的点:
添加菜单的click事件使用switch循环,对于窗体较多的案例不太适用
在本网站中,未找到相似案例,大家有做的成熟的,麻烦交流一下![抱拳]