C# 更改表单时丢失变量值

C# 更改表单时丢失变量值,c#,winforms,C#,Winforms,我有一个非常简单的程序,帮助您了解如何在C#中使用多个表单。我有Form1(Form1)和Form2(Form2)。在form1上,我有一个按钮、一个标签和一个串行端口。在form2上,我有一个按钮和一个标签。程序所做的是,当我点击按钮时,它关闭窗体,打开另一个窗体,更改标签中的文本,然后更改波特率。以下是form1的代码: public partial class Form1 : Form { //Making a refernce of Form2 called 'form2'.

我有一个非常简单的程序,帮助您了解如何在C#中使用多个表单。我有Form1(Form1)和Form2(Form2)。在form1上,我有一个按钮、一个标签和一个串行端口。在form2上,我有一个按钮和一个标签。程序所做的是,当我点击按钮时,它关闭窗体,打开另一个窗体,更改标签中的文本,然后更改波特率。以下是form1的代码:

public partial class Form1 : Form
{
    //Making a refernce of Form2 called 'form2'.
    Form2 form2 = new Form2();

    public Form1()
    {
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Able to reference form2 in a style that replicated VB.NET
        form2.Show();
        this.Hide();
        form2.label2.Text = ("Hello2");
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        label1.Text = ("Start!");
        ApplicationPort.BaudRate = 200;
    }
以下是表格2的代码:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Declaring the new instance of Form1 called 'form1'.
        var form1 = new Form1();     
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }

    public void Form2_Load(object sender, EventArgs e)
    {
        //Declaring the new instancce for Form1 called 'form1'.
        var form1 = new Form1();
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());

    }
}
因此,当我启动程序时,波特率是200。当我点击按钮,第二个表单打开时,在加载事件中,我有一个消息框,显示波特率为9600,默认值。然后,当我单击form2中的按钮时,消息框显示原始波特率200。为什么加载事件处理程序没有获取该值?我是在写引用,还是出了什么问题?我正在使用Visual Studio 2010 Express WinForms

    var form1 = new Form1();
    MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
通过此操作,您将创建新的
Form1
实例,该实例的所有设置都将设置为默认值

您需要将
Form1
对象的现有实例传递给新创建的
Form2
对象

public partial class Form2 : Form
{
    Form1 form1;
    public Form2(Form1 frm)
    {
        form1 = frm;
        InitializeComponent();

    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Declaring the new instance of Form1 called 'form1'.
        //var form1 = new Form1();     
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }

    public void Form2_Load(object sender, EventArgs e)
    {
        //Declaring the new instancce for Form1 called 'form1'.
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());

    }
}

public partial class Form1 : Form
{
    //Making a refernce of Form2 called 'form2'.
    Form2 form2; // Pass the instance of this object to Form2!

    public Form1()
    {
        form2 = new Form2(this)
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Able to reference form2 in a style that replicated VB.NET
        form2.Show();
        this.Hide();
        form2.label2.Text = ("Hello2");
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        label1.Text = ("Start!");
        ApplicationPort.BaudRate = 200;
    }
通过此操作,您将创建新的
Form1
实例,该实例的所有设置都将设置为默认值

您需要将
Form1
对象的现有实例传递给新创建的
Form2
对象

public partial class Form2 : Form
{
    Form1 form1;
    public Form2(Form1 frm)
    {
        form1 = frm;
        InitializeComponent();

    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Declaring the new instance of Form1 called 'form1'.
        //var form1 = new Form1();     
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }

    public void Form2_Load(object sender, EventArgs e)
    {
        //Declaring the new instancce for Form1 called 'form1'.
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());

    }
}

public partial class Form1 : Form
{
    //Making a refernce of Form2 called 'form2'.
    Form2 form2; // Pass the instance of this object to Form2!

    public Form1()
    {
        form2 = new Form2(this)
        InitializeComponent();
    }
    public void button1_Click(object sender, EventArgs e)
    {
        //Able to reference form2 in a style that replicated VB.NET
        form2.Show();
        this.Hide();
        form2.label2.Text = ("Hello2");
    }

    public void Form1_Load(object sender, EventArgs e)
    {
        label1.Text = ("Start!");
        ApplicationPort.BaudRate = 200;
    }

您正在从Form2创建Form1的新实例。您可以将Form1传递给Form2构造函数

public partial class Form2 : Form
{
    Form1 form1;

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
    }

    public void button1_Click(object sender, EventArgs e)
    {    
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }
}

您正在从Form2创建Form1的新实例。您可以将Form1传递给Form2构造函数

public partial class Form2 : Form
{
    Form1 form1;

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
    }

    public void button1_Click(object sender, EventArgs e)
    {    
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }
}

为了保存波特率的值,必须声明如下的
static
属性:

public static int baudRate = 200;
在包含SerialPort控件的窗体中


然后在表单构造函数中使用assign
buadRate
to
SerialPort

为了保存波特率的值,必须声明一个
static
属性,如下所示:

public partial class Form2 : Form
{
    Form1 form1;

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
    }

    public void button1_Click(object sender, EventArgs e)
    {    
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }
}
public static int baudRate = 200;
在包含SerialPort控件的窗体中


然后在表单构造函数中使用assign
buadRate
to
SerialPort

如果这看起来很懒,我很抱歉,但我对这个问题的回答可能会帮助您找出导致这种行为的原因;这看起来很相似:您正在从form2创建一个新的Form1实例。Form1中ApplicationPort对象的定义是什么?为了您的追随者,请停止使用
Form1
form2
@AustinSalonen这样的名称。这个程序在大约5分钟内就完成了,我很抱歉,如果这看起来很懒,但我对这个问题的回答可能会帮助你找出导致这种行为的原因;这看起来很相似:您正在从form2创建一个新的Form1实例。Form1中ApplicationPort对象的定义是什么?为了您的追随者,请停止使用
Form1
form2
@AustinSalonen这样的名称。这个程序在大约5分钟内就完成了,只是简单快捷的命名。当我尝试在代码中实现它时,我在
Form2 Form2=new Form2(this)中得到错误关键字“this”在当前上下文中不可用工作得很完美,我也有点理解它!谢谢。当我尝试在代码中实现这一点时,我在
Form2 Form2=new Form2(this)处得到了错误关键字“this”在当前上下文中不可用工作得很完美,我也有点理解它!非常感谢。
public partial class Form2 : Form
{
    Form1 form1;

    public Form2(Form1 form1)
    {
        InitializeComponent();
        this.form1 = form1;
    }

    public void button1_Click(object sender, EventArgs e)
    {    
        this.Hide();
        form1.Show();
        form1.label1.Text = ("hello");
        MessageBox.Show(form1.ApplicationPort.BaudRate.ToString());
    }
}