通过“;不是新的“;对象作为参数

本文关键字:参数 对象 通过 | 更新日期: 2023-09-27 17:59:26

可能很简单,我只是在学习C#。

我使用的是VS2013,有两种形式。

目标:文本框具有默认值。按下按钮(仍在表格1上)时,将表格1上文本框中输入的新值从表格1传递到表格2。

我在Form1和Form2上有一个文本框,它告诉我Form1的文本框中有什么。这是可以的,但我正在处理TextChangedEvent,所以如果我修改文本,创建Form1的新对象将导致有一个新实例,因此更改后的文本将被删除。它仍然是默认值。

问题:如何引用对象的当前值,而不创建新实例并具有默认值?

表格1:

public partial class Form1 : Form
{
    public string value { get; set; }
    public Form1()
    {
        Application.EnableVisualStyles();
        InitializeComponent();
        this.textBox1.Text = "Default";
    }
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        value = this.textBox1.Text;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        switch (comboBox2.SelectedIndex)
        {
            case -1:
                MessageBox.Show("You didn't choose anything.");
                break;
            case 0:
                MessageBox.Show("Value of variable: " + value); // Here it's the new value, NOT "Default"
                Form2 form_Form2 = new Form2();
                form_Form2.ShowDialog();
                break;
        }
    }
}

表格2:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form1 getdata = new Form1();
        string value = getdata.value;
        if (checkBox1.Checked)
        {
            MessageBox.Show("Value: " + value); // Here it's "Default" :(
        }
        else if (!checkBox1.Checked)
        {
            MessageBox.Show("Value: " + value); // TBD
        }
    }
}

通过“;不是新的“;对象作为参数

解决方案是将对Form1的引用注入Form2。你可以这样做:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public Form1 OtherForm { get; set; }
    private void button1_Click(object sender, EventArgs e)
    {
        string value = OtherForm.value;
        ...

然后,在创建Form1Form2实例的代码集中,执行以下操作:

Form1 form1 = new Form1();
Form2 form2 = new Form2();
form2.OtherForm = form1;

我只想在表单2上创建一个变量和一个更改它的方法,然后在表单1上按下按钮时执行类似form_form2.someMethod(value)的操作
,但我不确定这是推荐的处理方法。

我认为您还必须更改form_form2的范围。

不要创建新的Form1。将您的价值传递到您的Form2。我稍微修改了你的代码:

Form1

namespace GUITest
{
  public partial class Form1 : Form
  {
    private string _value = "Default"; // Create a private field with your Default Value
    public string Value
    {
      get
      {
        return _value;
      }
      set
      {
        _value = value
      }
    }
    public Form1()
    {
      Application.EnableVisualStyles();
      InitializeComponent();
      this.textBox1.Text = Value;
    }
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
      Value = this.textBox1.Text;
    }
    private void button1_Click(object sender, EventArgs e)
    {
      switch (comboBox2.SelectedIndex)
      {
        case -1:
          MessageBox.Show("You didn't choose anything.");
          break;
        case 0:
          MessageBox.Show("Value of variable: " + value); // Here it's the new value, NOT "Default"
          Form2 form_Form2 = new Form2(Value); // Pass the Value to the Constructor of Form2
          form_Form2.ShowDialog();
          break;
      }
    }
  }
}

Form2

namespace GUITest
{
  public partial class Form2 : Form
  {
    private string _value; // Again your field but this time without your default Value
    public Form2(string myVal)
    {
      InitializeComponent();
      _value = myVal;
    }
    private void button1_Click(object sender, EventArgs e)
    {
      if (checkBox1.Checked)
      {
        MessageBox.Show("Value: " + _value); // Here it's now not anymore "Default" :)
      }
      else // Removed redundant if
      {
        MessageBox.Show("Value: " + _value); // TBD
      }
    }
  }
}

一般来说:即使只有你在做这个项目。。。为控件提供自我解释的名称;)这将使您的开发人员生活更加轻松:)

代码应该有效。我现在无法测试。如果出现错误,请评论!:)

来源:我自己的专业知识^^

由于您使用的是ShowDialog(),所以当Form2实例将执行返回给Form1时,只需获取它的值。Form2不需要任何形式的Form1引用就可以工作。。。

所以你需要做两件事:

  1. 以某种方式将当前值传递给Form2(通过构造函数是一种常见的方式,并且已经显示)
  2. 如果返回"OK",则从Form2中检索新值。Form2的房产最好

以下是这两件事:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.Text = "Default";
    }
    private void button1_Click(object sender, EventArgs e)
    {
        switch (comboBox2.SelectedIndex)
        {
            case -1:
                MessageBox.Show("You didn't choose anything.");
                break;
            case 0:
                Form2 form_Form2 = new Form2(this.textBox1.Text);
                if (form_Form2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.textBox1.Text = form_Form2.Value;
                }
                break;
        }
    }
}
public partial class Form2 : Form
{
    private Form2() { }
    public string Value
    {
        get
        {
            return this.textBox1.Text;
        }
    }
    public Form2(string currentValue)
    {
        InitializeComponent();
        this.textBox1.Text = currentValue;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.DialogResult = System.Windows.Forms.DialogResult.OK;
    }
}