在 C# 中的窗体之间传输变量

本文关键字:之间 传输 变量 窗体 | 更新日期: 2023-09-27 18:04:41

我有 2 种形式 - 表格 1 和表格 2。

表格1:

    public partial class Form1 : Form
    {
        public void Drawnewmap(bool suzey) {
            bool dsuzey=suzey;
            if (dsuzey==true) textBox1.Text = "1" ;
        }
        public Form1()
        {
            InitializeComponent();
        }
     }

表格2:

private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    f1.Drawnewmap(m);
    this.Close();
}

但是当我点击时,什么也没发生。文本框为空。为什么?

在 C# 中的窗体之间传输变量

你从来没有真正显示过表单,也许你应该有更像的东西:

我有 2 种表格 - 表格 1 和表格 2。

private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    f1.Drawnewmap(m);
    f1.Show(); // You're missing this call
    this.Close();
}

如果你想通过第二个表单到达你的第一个活动表单,你应该在第二个表单中定义第一个表单,如下所示:

Form1 frm = (Form1)Application.OpenForms["Form1"];

而不是

Form1 f1 = new Form1();
由于如果使用"Form1

f1 = new Form1((;",您将创建一个新表单,因此您将无法访问活动表单。

因为您创建新的 Form1 实例。我认为从子窗口中的父窗口调用某些内容是个坏主意。但是你可以像这样做烟熏:创建 Form2 时,传递对当前 Form1 对象的引用

Form2 form = new Form2(this);

在 Form2 构造函数中,将 Form1 引用保存在私有变量中。

private Form1 myform1;

然后,您的代码需要如下所示:

private void button1_Click(object sender, EventArgs e)
{
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    myform1.Drawnewmap(m);
    this.Close();
}

您没有显示您创建的form1

private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    bool m = false;
    if (checkBox1.Checked == true) m = true;
    f1.Drawnewmap(m);
    f1.Show();//or ShowDialog()...
    this.Close();
}

请注意,如果Form2是主窗体"您可以在 Main 上检查它",如果您关闭它,它将退出整个应用程序,因此如果是这种情况,要么使 form1 成为主窗体,要么调用此this.Hide();而不是this.Close();

我更喜欢使用保存状态的形式中的属性来解决这个问题

== 表格 1 ==

public partial class Form1 : Form
{
    bool is_dsuzey;
    public Form1()
    {
        InitializeComponent();
    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        if (is_dsuzey) textBox1.Text = "1";
    }
    public bool IsDsuzey { get { return is_dsuzey; } set { is_dsuzey = value; } }
}

== 表格 2 ==

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.IsDsuzey = checkBox1.Checked;
        f1.Show();
    }
}

如果它是应用程序的主要形式,我会提醒this.Close();语句Form2,因为它将关闭整个应用程序。如果Application.Run()调用其他形式,则没有问题。