我一直在尝试制作多种形式的程序,但我一次又一次遇到同样的问题:
最近一直很烦人,我决定在这里问一下,我可能(或可能不会)做错了什么。这是我的快速再现 - 一个程序,您可以使用另一种形式设置给定值:
valueForm
public partial class valueForm : Form
{
public int value;
private changeValueForm change;
public valueForm()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
value = 2;
valueLabel.Text = value.ToString();
change = new changeValueForm();
}
private void change_Click(object sender, EventArgs e)
{
change.Show();
}
private void updatin_Tick(object sender, EventArgs e)
{
valueLabel.Text = change.thisValue.ToString();
}
}
changeValueForm
public partial class changeValueForm : Form
{
private valueForm valueForm;
public int thisValue;
private string[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
public changeValueForm()
{
InitializeComponent();
}
private void changeValueForm_Load(object sender, EventArgs e)
{
valueForm = new valueForm();
thisValue = valueForm.value;
valueBox.Text = thisValue.ToString();
}
private void closeButton_Click(object sender, EventArgs e)
{
if (digits.Contains(valueBox.Text.ToString()))
{
thisValue = Int32.Parse(valueBox.Text);
valueForm.value = thisValue;
}
}
}
所以,总结一下,这段代码出了什么问题?
PS How to pass values between forms in c# windows application?可能会解决1.问题,但valueForm
仍然不接受changeValueForm
中所做的更改 - 它只是保持原样是
答案 0 :(得分:0)
而不是在这里创建valueForm
的新实例:
private void changeValueForm_Load(object sender, EventArgs e)
{
valueForm = new valueForm();
您应该将changeValueForm
实例引用传递给您现有的valueForm
并使用它。
例如,您可以在创建changeValueForm
时完成此操作,例如change = new changeValueForm(this);
。
在这种情况下,您还需要将changeValueForm构造函数更改为
public changeValueForm(valueForm f)
{
InitializeComponent();
valueForm = f;
}
从您发布的代码中还不清楚 - 何时调用updatin_Tick
方法并且应该调用它?我可以从方法名称猜测它 - 它应该是一些计时器 - 但是你的代码中没有声明任何计时器。
答案 1 :(得分:0)
这是一种常见的情况。在changeValueForm
中,您可以创建valueForm
的新实例。这个新实例与初始形式没有任何共同之处(与同一类相同)。这是一种完全不同的形式。因此,当您为changeValueForm
内创建的实例设置属性时,您将设置不可见的表单属性。 (只是尝试在该实例上调用Show()
。)
解决问题的最简单方法是将初始valueForm
的实例传递给代码创建的changeValueForm
。
通常这是在构造函数中完成的,但也可以使用valueChangeForm类的公共自定义属性传递。
使用构造函数
public partial class changeValueForm : Form
{
private valueForm valueForm;
....
public changeValueForm(valueForm currentInstance)
{
InitializeComponent();
valueForm = currentInstance;
}
当然,当你构建你的changeValueForm时,你可以调用
public partial class valueForm : Form
{
public int value;
private changeValueForm change;
public valueForm()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
value = 2;
valueLabel.Text = value.ToString();
// pass this instance to the changeValueForm
change = new changeValueForm(this);
}
使用财产
public partial class changeValueForm : Form
{
private valueForm valueForm;
public changeValueForm ClientCaller
{ get { return valueForm};
set { valueForm = value};
}....
public partial class valueForm : Form
{
...
private void Form1_Load(object sender, EventArgs e)
{
....
change = new changeValueForm();
change.ClientCaller = this;
}