C# 从Form2获取Form1复选框的值

C# 从Form2获取Form1复选框的值,c#,winforms,C#,Winforms,我在这里和其他一些与此相关的网站上搜索过,并找到了答案。然而,要么解决方案不起作用,要么太模糊,我无法理解。我会解释我说“行不通”的意思 我尝试过两种方法。第一个是使用get和set,第二个是简单地将控件修饰符设置为true 使用这两个选项时,Form1的设计器中的值似乎不会更新,因此Form2只会将该值读取为false,因为默认情况下该值是复选框的值 在表格1中: public bool CheckBox { get { return this.checkBox

我在这里和其他一些与此相关的网站上搜索过,并找到了答案。然而,要么解决方案不起作用,要么太模糊,我无法理解。我会解释我说“行不通”的意思

我尝试过两种方法。第一个是使用
get
set
,第二个是简单地将控件修饰符设置为true

使用这两个选项时,
Form1
的设计器中的值似乎不会更新,因此
Form2
只会将该值读取为false,因为默认情况下该值是复选框的值

表格1
中:

    public bool CheckBox
    {
        get { return this.checkBox1.Checked; }
        //set { this.checkBox1.Checked = value; }
    }

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

        frm.ShowDialog();
    }
表格2中

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 frm = new Form1();

        if (frm.CheckBox == true)
        {
            //Do whatever
        }
    }
这基本上就是我想要做的。如果我做错了什么,或者有更好的方法,请告诉我

谢谢。

我猜这里的问题是如何使用实例变量。假设我有两种形式——形式1和形式2,它们的定义如下:

Form1 a = new Form1();
Form2 b = new Form2();
现在,在应用程序生命周期的后期,用户单击表单2上的按钮,您拥有的是(伪代码):

问题是“c”和“a”形式不一样——它们是同一形式的两个不同实例。解决此问题的最简单方法是将复选框设置为静态:

// in Form1...
public static bool CheckBox { get; set; }
现在您只有一个复选框值,它对于Form1的所有“副本”(实例)都是相同的

注释

这是可行的,但并不完美。如果你想要两份Form1,而不是每个都有自己的“复选框”值,这对你来说是行不通的。相反,您需要做的是开始传递实例。因此,我在答案开头列出的代码需要更改为:

Form1 a = new Form1();
Form2 b = new Form2(a);
其中,“Form2”现在定义为:

public class Form2 : System.Windows.Forms.Form {
   private Form1 copyOfForm1;

   public Form2(Form1 theInstance) {
     InitializeComponent();
     copyOfForm1 = theInstance;
   }
}

现在,只要使用“copyOfForm1”变量,就可以从FormB内部访问Form1的一个实例。这与关于实例/静态的所有内容都相去甚远,但希望它至少能让您走上正确的轨道。祝你好运

您正在
Form2
中创建一个新的
Form
实例。它与当前的
Form1
实例完全不同

相反,您可以将当前Form1实例传递给
ShowDialog
方法,如下所示:

 frm.ShowDialog(this);
通过这样做,您将
Form2
的属性设置为
Form1
实例。因此,您可以使用
Owner
属性从
Form2
访问当前实例。您还应该将其强制转换为
Form1
以访问
复选框
属性

private void button1_Click(object sender, EventArgs e)
{

    if (((Form1)Owner).CheckBox == true)
    {
        //Do whatever
    }
}
using (var form2 = new Form2())
{
    if (form2.ShowDialog() == DialogResult.OK)
    {
        var checkboxValue = form2.Checkbox;
    }
}

在Form2上,将复选框值设为属性。关闭表单时,可以将对话框Result设置为OK。因此,在form2的闭幕式上或在您真正想要的任何地方:

this.DialogResult = DialogResult.OK;
然后使用以下命令创建、显示和检索复选框值(在关闭form2时也会处理它)。当DialogResult正常时,可以从属性中获取值

private void button1_Click(object sender, EventArgs e)
{

    if (((Form1)Owner).CheckBox == true)
    {
        //Do whatever
    }
}
using (var form2 = new Form2())
{
    if (form2.ShowDialog() == DialogResult.OK)
    {
        var checkboxValue = form2.Checkbox;
    }
}
如果不想关闭表单,可以将另一个bool属性设置为true,并在需要获取复选框值时检查该属性。因此,在表格2中:

public bool CheckboxSelected { get; set; }
public bool Checkbox { get; set; }
event for Checkbox change:
    Checkbox = value of checkbox;
    CheckboxSelected = true;
然后在Form1上,您可以查看CheckboxSelected==true:

using (var form2 = new Form2())
{
    if (form2.CheckboxSelected == true)
    {
        var checkboxValue = form2.Checkbox;
    }
}

更简单的解决方案:

表格1:

(选中复选框时运行的代码)

表格2:

(加载表单时运行的代码)


你需要一个对表单的引用,而不是一个新的表单。我仍然是C#的初学者,我没有意识到这一点。谢谢大家对我的帮助。
string GetResult = File.ReadLines("C:\\Checked.txt").First();

if(GetResult == "true")
{
///Any Code Here///
}