3

我在 Form 1 中有两个按钮,一个是“ShowForm2”按钮,一个是“button1”按钮。

按钮 1 默认禁用。当我单击“ShowForm2”按钮时,将显示 Form 2。

我的表格 1 的 PrntScn

所以,我想要的是,当我单击表单 2 中的“button2”时,它将启用表单 1 中的“button1”。

在此处输入图像描述

所以,我尝试在我的 form2 类中编写这样的代码:

public partial class Form2 : Form
{
    bool enable_form1_button1;
    public bool Enable_form1_button1
    {
        get { return this.enable_form1_button1; }
        set { this.enable_form1_button1 = value; }
    }
    public Form2()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        enable_form1_button1 = true;
    }
}

然后在我的 Form1 类中,我希望将“enable_form1_button1 = true”传递到表单 1 并启用我的表单 1 button1。但是如何做到这一点?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btb_Showfrm2_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
        button1.Enabled = frm2.Enable_form1_button1; // I put it here, and it just does not seems right
    }
}
4

5 回答 5

6

那么您可以做的是,将按钮公开为属性并将当前表单的引用发送到需要控制的表单:

表格1

public partial class Form1 : Form
{        
    public Button BtnShowForm2
    {
        get { return btnShowForm2; }
        set { btnShowForm2 = value; }
    }

    private void btnShowForm2_Click(object sender, EventArgs e)
    {
        // pass the current form to form2
        Form2 form = new Form2(this);
        form.Show();
    }
}

然后在Form2中:

public partial class Form2 : Form
{
    private readonly Form1 _form1;

    public Form2(Form1 form1)
    {
        _form1 = form1;
        InitializeComponent();
    }

    private void btnEnabler_Click(object sender, EventArgs e)
    {
        // access the exposed property here <-- in this case disable it
        _form1.BtnShowForm2.Enabled = false;
    }
}

我希望这就是你要找的。

于 2013-05-19T06:11:08.453 回答
4

Form1.cs

    public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
        button1.Enabled = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 oFrm2 = new Form2();
        oFrm2.evtFrm += new ShowFrm(oFrm2_evtFrm);
        oFrm2.Show();
    }

    void oFrm2_evtFrm()
    {
        button1.Enabled = true;
    }
}

Form2.cs

    public delegate void ShowFrm();
    public partial class Form2 : Form
    {
    public event ShowFrm evtFrm;
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (evtFrm != null)
        {
            evtFrm();
        }
    }
}
于 2013-05-19T09:20:30.043 回答
1

例如,您可以在 from2 构造函数中将 form1 的引用发送到 form2:然后在 form2 中的按钮单击事件处理程序中调用 form1 中的公共方法以启用按钮:

这可能是您的 form1 代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this);
            frm.Show();
        }

        public void enableButton()
        {
            button2.Enabled = true;
        }

这可能是您的 form2 代码:

public partial class Form2 : Form
    {
        private Form1 frm;
        public Form2(Form1 frm)
        {
            InitializeComponent();

            this.frm = frm;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            frm.enableButton();
        }
于 2013-05-19T06:12:01.700 回答
0

如果你只有一个实例,Form1你也可以使用一个静态Button成员Program来引用你想要从Form2.

Form1.cs:

using System;
using System.Windows.Forms;

namespace StackOverflow_2013_05_19_Form1_Form2_buttons
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            button2.Enabled = false;

            Program.button = button2;
        }

        private void button1_Click(object sender, EventArgs e)
        { new Form2().Show(); }

        private void button2_Click(object sender, EventArgs e) { }
    }
}

Form2.cs:

using System;
using System.Windows.Forms;

namespace StackOverflow_2013_05_19_Form1_Form2_buttons
{
    public partial class Form2 : Form
    {
        public Form2()
        { InitializeComponent(); }

        private void button1_Click(object sender, EventArgs e)
        { Program.button.Enabled = true; }
    }
}

程序.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace StackOverflow_2013_05_19_Form1_Form2_buttons
{
    static class Program
    {
        public static Button button;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
于 2013-05-19T06:46:37.053 回答
0

我建议您使用事件/委托来执行此任务。这是这样做的标准方法。

再次在构造函数中传递引用或制作静态 func/var/properties 只是解决方法,称为错误编程。

于 2013-05-19T08:20:00.583 回答