窗体基础操作
设置软件启动的默认窗体
程序的入口在 Program.cs 的 Main 方法中,通过 Application.Run(new Form1()) 指定启动窗体:

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); // 修改 Form1 为其他窗体即可更换启动窗体
}Code language: JavaScript (javascript)
从一个窗体打开另一个窗体
在主窗体中通过按钮事件打开新窗体,有两种方式:
private void button1_Click(object sender, EventArgs e)
{
FormAddUser fa = new FormAddUser();
// fa.Show(); // 非模态:打开后可继续操作主窗体
fa.ShowDialog(); // 模态:必须关闭该窗体才能操作主窗体
}Code language: JavaScript (javascript)
| 方式 | 方法 | 说明 |
|---|---|---|
| 非模态 | Show() | 打开后主窗体可继续交互,可同时打开多个 |
| 模态 | ShowDialog() | 阻塞主窗体,必须关闭后才能返回 |
窗体间参数传递
方式很多,这里以构造函数传参为例:
主窗体(调用方):
private void button1_Click(object sender, EventArgs e)
{
FormAddUser fa = new FormAddUser("foxdevelop.com");
fa.ShowDialog();
}Code language: JavaScript (javascript)
目标窗体(接收方):
public partial class FormAddUser : Form
{
private string v;
public FormAddUser()
{
InitializeComponent();
}
// 带参构造函数
public FormAddUser(string v)
{
this.v = v;
InitializeComponent();
}
private void FormAddUser_Load(object sender, EventArgs e)
{
// 使用传递过来的参数
this.label1.Text = v;
}
}
其他常见传参方式
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 构造函数传参 | 最简单直接 | 打开时一次性传值 |
| 公有属性/字段 | 目标窗体暴露属性,调用方赋值 | 需要在打开前后多次传值 |
| 静态类/变量 | 全局共享 | 多处需要访问的公共数据 |
| 委托/事件 | 子窗体回调父窗体 | 子窗体操作需要通知父窗体 |
| 数据库/文件 | 持久化存储中转 | 数据量大或需持久化 |
Owner 属性 | 通过 form.Owner 访问父窗体 | 子窗体需要反向访问父窗体 |
公有属性方式示例:
// 目标窗体
public string UserName { get; set; }
// 主窗体
FormAddUser fa = new FormAddUser();
fa.UserName = "张三";
fa.ShowDialog();Code language: PHP (php)
委托/事件方式示例:
// 目标窗体定义事件
public event Action<string> OnDataSubmitted;
private void button1_Click(object sender, EventArgs e)
{
OnDataSubmitted?.Invoke(this.textBox1.Text);
this.Close();
}
// 主窗体订阅
FormAddUser fa = new FormAddUser();
fa.OnDataSubmitted += (data) => { this.label1.Text = data; };
fa.ShowDialog();Code language: JavaScript (javascript)
通过 Owner 反向访问:
// 打开时指定 Owner
FormAddUser fa = new FormAddUser();
fa.Owner = this;
fa.ShowDialog();
// 子窗体中访问父窗体
Form1 parent = (Form1)this.Owner;
parent.label1.Text = "来自子窗体的数据";Code language: JavaScript (javascript)
关闭窗体
this.Close(); // 关闭当前窗体
Application.Exit(); // 退出整个应用程序Code language: JavaScript (javascript)
注意事项
- 构造函数中
InitializeComponent()必须保留,且放在字段赋值之后 - 模态窗体
ShowDialog()可以接收返回值判断关闭方式:
DialogResult result = fa.ShowDialog();
if (result == DialogResult.OK)
{
MessageBox.Show("用户点击了确定");
}Code language: JavaScript (javascript)
目标窗体中设置返回值:
private void buttonOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
this.Close();
}Code language: JavaScript (javascript)
Previous: WebBrowser 内嵌网页浏览器控件
Next: 子窗体操作完成后通知父窗体刷新