如何制作Form1标签.当选中form2上的复选框时,文本更改

本文关键字:复选框 文本 form2 Form1 何制作 标签 | 更新日期: 2023-09-27 18:05:53

我是c#的新手,正在尝试用两种不同的形式进行我的第一次实验。

我想让它在Form1上有一个标签1和一个按钮1,在Form2上有一个复选框1。

Form1上的button1打开Form2,一旦你选中了Form2上的checkbox1, label1中的文本就会改变。

我认为这必须使用事件来完成,但是到目前为止,事件是唯一真正让我困惑的事情,所以我想本质上这个问题更多的是关于事件的使用。如果我在MSDN和其他网站上查找它,我也会发现它非常令人困惑。

非常感谢你的帮助,这让我觉得自己非常愚蠢。

如何制作Form1标签.当选中form2上的复选框时,文本更改

在这种情况下,您可以使用CheckedChanged事件:

public void checkbox2_CheckedChanged(object sender, EventArgs e) {
    if (checkbox2.Checked) 
    {
        Form1.Label1.Text = "Checkbox 2 has been checked";
    } else 
     { 
        Form1.Label1.Text = "";
     }
}
http://www.c-sharpcorner.com/uploadfile/mahesh/checkbox-in-C-Sharp3/

注意,您必须更改Form1中的访问修饰符并使Label1公开,以便Form2可以更改Text属性。

要做到这一点,转到Form1,选择Label1,转到Properties,选择Modifiers,从Private更改为Public。Form2可以访问Label .

使用Controller和Events来解耦表单

正确的方法是通过引入Controller类来解耦这两种形式,并使用events来指示状态变化。

下面是一个例子。

首先,创建一个新的默认Windows窗体应用程序WindowsFormsApplication1,并添加两个窗体,form1form2

然后给form1添加一个按钮名为"button1"和一个标签名为"label1"。

然后给form2添加一个名为"checkbox1"的复选框。

form1设计器中,双击按钮以为其添加单击处理程序。

form2设计器中,双击复选框,为其添加更改处理程序。

现在添加一个名为Controller的新类,并添加以下代码:

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    internal sealed class Controller
    {
        public void RunForm1()
        {
            _form1 = new Form1();
            // The next line defines our response to the button being pressed in Form1
            _form1.ButtonClicked += (sender, args) => showForm2();
            Application.Run(_form1);
        }
        private void showForm2()
        {
            var form2 = new Form2();
            // The next line defines our response to the checkbox changing in Form2.
            form2.CheckBoxChanged += 
                (sender, args) => 
                _form1.SetLabel("Checkbox = " + ((CheckBox)sender).Checked);
            form2.ShowDialog(_form1);
        }
        private Form1 _form1 ;
    }
}

现在将Form1.cs更改为:

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1: Form
    {
        // Here's where we announce our event handler to the world:
        public event EventHandler ButtonClicked;
        public Form1()
        {
            InitializeComponent();
        }
        public void SetLabel(string text)
        {
            label1.Text = text;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // We make a copy of ButtonClicked before checking it for null because
            // in a multithreaded environment some other thread could change it to null
            // just after we checked it for nullness but before we call it, which would
            // cause a null reference exception.
            // A copy cannot be changed by another thread, so that's safe to use:
            var handler = ButtonClicked;
            if (handler != null)
                handler(sender, e);
        }
    }
}

并将Form2.cs更改为:

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form2: Form
    {
        // Here's the event handler for the check box:
        public event EventHandler CheckBoxChanged;
        public Form2()
        {
            InitializeComponent();
        }
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            var handler = CheckBoxChanged;
            if (handler != null)
                handler(sender, e);
        }
    }
}

最后,将Program.cs更改为:

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Controller controller = new Controller();
            controller.RunForm1();
        }
    }
}

现在运行程序并单击按钮,然后单击几次复选框。您将看到Form1中的标签发生了变化。

通过这种方式,您已经完全解耦了Form1Form2,并将控制逻辑放入单独的Controller类中。

您可以直接从Form1实例中订阅Form2实例中复选框的CheckedChanged事件。在Form1内部,在显示Form2订阅复选框

的CheckedChanged事件之前
Form2 frm = new Form2();
frm.chkBox1.CheckedChanged += new EventHandler(this.ReceiveCheckedChanged);
frm2.ShowDialog();

,然后在Form1 (this)中定义Form2

中引发的checkedChanged事件的处理程序。
private void ReceiveCheckedChanged(object sender, EventArgs e)
{
   CheckBox chk = sender as CheckBox;
   if(chk.Checked)
       this.label1.Text = "Checked";
   else
       this.label1.Text = "UnChecked";
}

要使其工作,您需要将复选框上的Modifiers属性从Private更改为Public

这样,Form2就不需要知道存在Form1,也不需要每次有人点击复选框时都需要更改另一个表单中的标签。更改其内部状态(标签上的文本)的责任由通知系统其要求的Form1承担。

Form1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        var form = new Form2();
        form.Changed += (o, args) => label1.Text = "some";
        form.ShowDialog();
    }
}

Form2:

public partial class Form2 : Form
{
    public delegate void ChangedEventHandler(object sender, EventArgs e);
    public event ChangedEventHandler Changed;
    public Form2()
    {
        InitializeComponent();
    }
    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (Changed != null)
        {
            Changed(this, e);
        }
    }
}

使用CheckBox的CheckedChanged事件