通过“;不是新的“;对象作为参数
本文关键字:参数 对象 通过 | 更新日期: 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;
...
然后,在创建Form1
和Form2
实例的代码集中,执行以下操作:
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引用就可以工作。。。
所以你需要做两件事:
- 以某种方式将当前值传递给Form2(通过构造函数是一种常见的方式,并且已经显示)
- 如果返回"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;
}
}