【问题标题】:Losing variable value when changing forms更改表格时丢失变量值
【发布时间】:2013-08-13 05:11:40
【问题描述】:

我有一个非常简单的程序,可以帮助弄清楚如何在 C# 中使用多个表单。我有 Form1(form1) 和 Form2(form2)。在 form1 上,我有一个按钮、一个标签和一个串行端口。在 form2 我有一个按钮和一个标签。程序所做的是,当我单击它关闭的按钮时,该表单会打开另一个,更改标签中的文本,然后更改 BaudRate。这是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;
    }

这是form2的代码:

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的原始BaudRate。为什么 Load 事件处理程序没有获取值?我是在写引用还是有什么问题?我正在使用 Visual Studio 2010 Express WinForms。

【问题讨论】:

  • 如果这看起来很懒惰,我很抱歉,但我对这个问题的回答可能会帮助您找出导致这种行为的原因;看起来非常相似:stackoverflow.com/questions/18196511/…
  • 您正在从 form2 创建一个新的 Form1 实例。
  • Form1中ApplicationPort对象的定义是什么?
  • 为了那些关注你的人的爱,请停止使用像Form1Form2这样的名字。
  • @AustinSalonen 这个程序在大约 5 分钟内就完成了,只是简单快速地命名。

标签: c# winforms


【解决方案1】:
    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;
    }

【讨论】:

  • 当我尝试在代码中实现这一点时,我收到错误 Keyword 'this' is not available in the current context at Form2 form2 = new Form2(this);
  • 效果很好,我有点理解!谢谢。
【解决方案2】:

您正在从 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());
    }
}

【讨论】:

    【解决方案3】:

    为了保存波特率的值,你必须像这样声明一个static属性:

    public static int baudRate = 200;
    

    在包含 SerialPort 控件的表单中。

    然后在表单构造函数中使用将buadRate 分配给SerialPort

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 2013-10-26
      相关资源
      最近更新 更多