窗体基础操作

窗体基础操作

设置软件启动的默认窗体

程序的入口在 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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注