可能是一个简单的,我只是在学习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
}
}
}
答案 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;
...
然后在您创建Form1
和Form2
个实例的代码中,执行以下操作:
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的任何类型的引用才能实现...
所以你需要做两件事:
以下是这两件事:
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;
}
}