传递“非新”对象作为参数

时间:2015-06-24 21:36:05

标签: c# .net winforms

可能是一个简单的,我只是在学习C#。

我正在使用VS2013,有两种形式。

目标:文本框具有默认值。按下按钮(仍然在form1上)时,将form1上的文本框中新输入的值从form1传递给form2。

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

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

Form1中:

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
        }
    }
}

4 个答案:

答案 0 :(得分:1)

解决方案是将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;

答案 1 :(得分:0)

我只是在表单2上创建一个变量,并在一个方法中更改它,然后当在表单1上按下按钮时执行类似form_form2.someMethod(value)的事情,但我不确定& #39;是推荐的处理方法。

你还必须改变我相信的form_form2的范围。

答案 2 :(得分:0)

不要创建新的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;
      }
    }
  }
}

<强>窗体2

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
      }
    }
  }
}

一般情况:即使只是你在这个项目上工作......让你的控件自我解释名称;)它会让你的开发人员生活更轻松:)

代码应该有效。我此刻无法测试它。如果发生错误,请发表评论! :)

来源:我自己的诀窍^^

答案 3 :(得分:0)

由于您正在使用ShowDialog(),因此只需将Form2实例的值返回到Form1即可获取该值。 Form2 需要对Form1的任何类型的引用才能实现...

所以你需要做两件事:

  1. 以某种方式将当前值传递给Form2(通过构造函数是一种常见的方式并且已经显示)。
  2. 如果返回“确定”,则从Form2中检索新值。 Form2中的属性最好。
  3. 以下是这两件事:

    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;
        }
    
    }