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上添加了此内容。

  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