winform唯一窗体
唯一窗体,你需要考虑几点,首先,你打开和关闭时候的问题,打开新的窗体,是否关闭原先的窗体,考虑到焦点的问题。每次当你打开新的窗体的时候,原先的窗体没有关闭,我们把它存在了一个集合里,判断这个集合里是否有这个窗体,建立的集合,当你删除你新打开的窗体时,只是把后台删了,但集合里还是有这个窗体,这时你再打开新的窗体时需要去比较,看看是否打开的窗体一样,一样的话就直接打开,没有一样的说明集合里没有和你将要打开的窗体一致的,需要你新打开一个窗体。
public Form1() { InitializeComponent(); } List<Form> list = new List<Form>(); //建立一个集合 放窗口 private void 销售ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 f2 = new Form2(this); f2.Name = "f2"; onlyone(f2); ; } private void 业务ToolStripMenuItem_Click(object sender, EventArgs e) { Form3 f3 = new Form3(this); f3.Name = "f3"; onlyone(f3); } private void 财务ToolStripMenuItem_Click(object sender, EventArgs e) { Form4 f4 = new Form4(this); f4.Name = "f4"; onlyone(f4); //引用查询的方法 ,看看是否在里面 } public void deletefm(Form ff) { list.Remove(ff); //集合里移除 这个方法用在当关闭其他窗体时。删除只能是你关闭时删除谁,不能删其他的窗口,建立这个方法是为了 ,但你关闭窗口时,集合里还保存着原有的窗口,当你再次打开时,你打开了一个新的窗口,而不是第一个哪一个窗口,所以,当你关闭时,你要删除原先打开那个窗口,打开一个新的。 } //查找的方法 看看是否在集合里面,如果在理就用,不在里面就添加进去 public void onlyone(Form newf) { bool has = false; foreach (Form u in list) { if (u.Name == newf.Name) { has = true; newf = u; //集合里原有的那个窗口 } } if (has == false) { newf.Show(); list.Add(newf); } else { newf.WindowState = FormWindowState.Normal; //窗体的初始可视状态 newf.Focus(); //j焦点在哪里 } }
Form1 F1; public Form2(Form1 f1) //传值过来 { InitializeComponent(); F1 = f1; } private void Form2_FormClosing(object sender, FormClosingEventArgs e) { F1.deletefm(this); //当关闭你打开的窗口时,执行删除的方法,把这个窗口关闭 }