使用按钮C#

时间:2018-04-16 11:37:54

标签: c# winforms visual-studio

对不起,我是C#初学者

我正在尝试在表单4上创建一个按钮,该按钮将更改表单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();

我做错了什么事吗?

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  1. 在Form3上,为什么要处理label2_click按钮?单击标签时会触发此事件。如果标签的Text属性为空字符串,您甚至不会看到标签以便能够点击它。

  2. 此代码:

    Form4 form4 = new Form4();
    
    if (form4.buttonchecked == true)
    // etc
    

    在逻辑上不正确,因为您正在创建一个Form4实例,然后您正在检查它的公共字段(buttonchecked的值而不显示表单。默认值布尔变量为false,因此控件将始终命中 else 分支。这就是你总是收到"You pressed button2"消息的原因。

  3. 使用您的代码执行此操作的一种正确方法如下:

    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再一次,你不能同时玩这两个)。

    所以这是一个解决这个问题的新(干净)解决方案:

    • 在Designer模式下的Form3上,单击label2 - >属性 - >修饰符 - >上市。通过这种方式,您可以从其他表单访问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";
         }
      }
      

    注意:在该解决方案上,Form3需要在之前打开,否则Application.OpenForms["Form3"]将返回null或者它将引发异常。

    如果您有任何其他问题,请随时发表评论。