如何在C#两个窗体之间传递CheckBox复选框的选中值
问题原因
- 检测逻辑写在
Form1构造函数中,构造函数仅在窗体初始化时执行1次,无法响应后续Form2的用户操作 Form2构造函数定义错误,构造函数无返回值,不能直接return复选框状态- 直接跨窗体访问控件成员不符合封装规范,也容易出现空引用异常
实现方案(最简单的DialogResult+公共属性方式)
第一步:修改Form2代码
编辑Form2的逻辑,定义公共属性存储复选框状态,绑定确认按钮的点击事件:
public partial class Form2 : Form { // 公共属性,对外暴露复选框的选中状态 public bool IsCheckboxChecked { get; private set; } public Form2() { InitializeComponent(); } // 确认按钮的点击事件,在设计界面双击确认按钮会自动生成该方法 private void confirmButton_Click(object sender, EventArgs e) { // 给属性赋值 IsCheckboxChecked = checkbox1.Checked; // 设置对话框返回结果为OK,同时自动关闭Form2 this.DialogResult = DialogResult.OK; } }
第二步:修改Form1代码
在Form1中需要打开Form2的位置(比如某个按钮的点击事件中)编写逻辑,不要写在构造函数里:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } // 比如点击Form1上的某个按钮弹出Form2,就把逻辑写在这个按钮的点击事件里 private void openForm2Button_Click(object sender, EventArgs e) { using (Form2 form2 = new Form2()) { // 弹出Form2,等待用户操作完成 if (form2.ShowDialog() == DialogResult.OK) { // 读取Form2暴露的属性,判断复选框状态 if (form2.IsCheckboxChecked) { MessageBox.Show("You check the checkbox"); } } } } }
补充说明
- 如果不需要模态弹窗(打开Form2的时候还能操作Form1),可以改用事件订阅的方式实现通知,新手可以先掌握上面的方法后再深入了解
- 不要直接跨窗体访问控件,通过公共属性/方法/事件传递数据是规范写法
内容的提问来源于stack exchange,提问作者Jason Wong
相关产品推荐
相关产品推荐

