1、哪个是主窗体
问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了
1、构造函数传值,将窗体传到另一个窗体中去
子窗体中的写法
public partial class Form2 : Form
{
Form1 F1 = null;
public Form2(Form1 f1)
{
InitializeComponent();
F1 = f1;
}
2、窗体只能打开一个
创建一个全局的泛型集合,为了放置全部打开的窗体
1、在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了
问题:当窗体打开了,关闭后,就无法再次打开了
办法:当窗体关闭时,清除Form1中集合中的此窗体对象记录
问题:当窗体已经打开,再次点击打开按钮,不会将已打开的窗体重新显示并焦点进入
办法:
找到已打开对象,将WindowState属性设置为:
找到已打开窗体的对象,使用Focus方法;
主窗体中的写法:
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "xtq" && textBox2.Text == "1234")//如果输入的账号和密码正确则登录
{
bool has = false;
Form2 f2 = new Form2(this);
foreach (Form f in flist)
{
if (f.Name == f2.Name)//如果新打开的窗口的name值和现在打开的窗口的name值相等的话什么也不干
{
has = true;
f.WindowState = FormWindowState.Normal;
f.Focus();
}
}
if (has)
{
f2.Close();
}
else//两者的name值不等的话把f2放到集合中去,并显示子窗口
{
flist.Add(f2);
f2.Show();
}
}
public void deleteform(Form F)//清除Form1中集合中的此窗体对象记录的方法
{
flist.Remove(F);
}
子窗体中的写法:
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
F1.Close();
if (F1 != null)
{
F1.deleteform(this);//调用主窗体中的delete方法
}
}
3、窗体之间的传值和控制
传值:构造函数传值
控制:第一步,找到窗体对象,第二步,将窗体对象的控件值更改
注意:要将窗体中的对象访问权限修改
主窗体中的写法:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if(textBox1.Text=="aaa"&&textBox2.Text=="111")
{
Form2 f2 = new Form2(this,textBox1.Text);
f2.ShowDialog();
}
}
}
子窗体中的写法:
public partial class Form2 : Form
{
Form1 F1 = null;
public Form2(Form1 f1,string uname)
{
InitializeComponent();
F1 = f1;
label1.Text = "欢迎回来!"+uname;
}
private void button1_Click(object sender, EventArgs e)
{
if(F1!=null)
{
F1.button1.Text = textBox1.Text;//使子窗体中的button按钮使用的时候会把其text赋值到主窗体中button的text
}
}
}
4、菜单
1、MenuStrip:菜单栏,显示按功能分组的应用程序命令和选项
顶部菜单
分割线:1、- 2、右键插入 split。。。
快捷键:每一个项右键属性的最下面可以设置快捷键
不管选项隐藏还是菜单隐藏,快捷键都管用
2、ContextMenuStrip:当用户右击关联控件时显示快捷菜单
右键菜单
3、StatusStript:就像是窗口底部的菜单栏
底部菜单
4、ToolStrip提供多种外观选项和和溢出以及运行时的工具栏
工具条
5、ToolStripContainer在每侧窗体都有一块面板,用于放置各种控件
工具条容器