This question already has an answer here:
Interaction between forms — How to change a control of a form from another form?
(1个答案)
去年关闭。
抱歉,我是C#初学者
我正在尝试在Form 4上创建一个按钮,该按钮将更改Form 3中对象的属性。
在这种情况下,每当我按下表单4上的按钮1时,表单3上的标签都会说“您按下了按钮1”,按钮2上的内容相同。
我在表格4上添加了此内容。
这就是我放在表格3中的内容:
我的label2文本始终设置为“您按下了button2”,但我没有
我添加了一个关闭当前窗体并打开另一个窗体的代码,这可能是引起问题的原因吗?
这是来自表格3
这是来自表格4
我做错了什么吗?
从逻辑上讲是不正确的,因为您正在创建Form4实例,然后在不显示表单的情况下检查了它的公共字段(
使用代码执行此操作的一种正确方法如下:
在Form3上:
在Form4上:
ShowDialog()方法将显示Form4,并将阻止执行Form3。在Form4上,您可以基于按下的按钮设置DialogResult,然后将结果返回到调用表单(Form3)。根据该结果,您可以做出决定。
该解决方案可以完成工作,但是有一个问题:由于Dialog约束,您不能同时使用两个表单(当您从Form3打开Form4时,必须关闭它才能再次到达Form3,您必须不能同时玩这两个游戏)。
因此,这里有一个新的(干净的)解决方案可以解决此问题:
在设计器模式下的Form3上,单击label2-> Properties-> Modifiers-> Public。这样,您可以从其他形式访问label2。
在Form4上,放置以下代码:
注意:在该解决方案上,需要在Form4之前打开Form3,否则
如果您还有其他问题,请随时发表评论。
(1个答案)
去年关闭。
抱歉,我是C#初学者
我正在尝试在Form 4上创建一个按钮,该按钮将更改Form 3中对象的属性。
在这种情况下,每当我按下表单4上的按钮1时,表单3上的标签都会说“您按下了按钮1”,按钮2上的内容相同。
我在表格4上添加了此内容。
public partial class Form4 : Form
{
public bool buttonchecked;
private void button1_Click_1(object sender, EventArgs e)
{
buttonchecked = true;
}
private void button2_Click_1(object sender, EventArgs e)
{
buttonchecked = false;
}
这就是我放在表格3中的内容:
public void label2_Click(object sender, EventArgs e)
{
Form4 form4 = new Form4(); //add
if (form4.buttonchecked == true)
{
label2.Text = "You pressed button 1";
}
else
{
label2.Text = "You pressed button2";
我的label2文本始终设置为“您按下了button2”,但我没有
我添加了一个关闭当前窗体并打开另一个窗体的代码,这可能是引起问题的原因吗?
这是来自表格3
this.Hide();
Form4 f4 = new Form4();
f4.ShowDialog();
这是来自表格4
this.Hide();
Form3 frm3 = new Form3();
frm3.ShowDialog();
我做错了什么吗?
最佳答案
您的代码存在一些问题:
在Form3上,为什么要处理label2_click按钮?单击标签时将触发此事件。如果标签的Text
属性是一个空字符串,则您甚至都看不到该标签,以便能够单击它。
这段代码:
Form4 form4 = new Form4();
if (form4.buttonchecked == true)
// etc
从逻辑上讲是不正确的,因为您正在创建Form4实例,然后在不显示表单的情况下检查了它的公共字段(
buttonchecked
)的值。布尔变量的默认值为false,因此控件将始终命中else分支。这就是您总是收到"You pressed button2"
消息的原因。使用代码执行此操作的一种正确方法如下:
在Form3上:
var form4 = new Form4();
var result = form4.ShowDialog();
if (result == DialogResult.OK)
{
label2.Text = "You pressed button 1";
}
else
{
label2.Text = "You pressed button 2";
}
在Form4上:
public partial class Form4 : Form
{
public bool buttonchecked;
private void button1_Click_1(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
}
private void button2_Click_1(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
}
ShowDialog()方法将显示Form4,并将阻止执行Form3。在Form4上,您可以基于按下的按钮设置DialogResult,然后将结果返回到调用表单(Form3)。根据该结果,您可以做出决定。
该解决方案可以完成工作,但是有一个问题:由于Dialog约束,您不能同时使用两个表单(当您从Form3打开Form4时,必须关闭它才能再次到达Form3,您必须不能同时玩这两个游戏)。
因此,这里有一个新的(干净的)解决方案可以解决此问题:
在设计器模式下的Form3上,单击label2-> Properties-> Modifiers-> Public。这样,您可以从其他形式访问label2。
在Form4上,放置以下代码:
public partial class Form4 : Form
{
private void button1_Click_1(object sender, EventArgs e)
{
var form3 = Application.OpenForms["Form3"];
form3.label2.Text = "You pressed button 1";
}
private void button2_Click_1(object sender, EventArgs e)
{
var form3 = Application.OpenForms["Form3"];
form3.label2.Text = "You pressed button 2";
}
}
注意:在该解决方案上,需要在Form4之前打开Form3,否则
Application.OpenForms["Form3"]
将返回null或将引发异常。如果您还有其他问题,请随时发表评论。
关于c# - 使用按钮C#将对象属性从窗体控制到另一个窗体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49856374/
10-13 09:25