从Form2获取Form1的复选框的值

时间:2014-02-07 00:09:58

标签: c# winforms

我在这里以及与此相关的其他一些网站上环顾四周,并找到了答案。但是,要么解决方案不起作用,要么让我无法理解。当我说“不会工作”时,我会解释我的意思。

我尝试过两种方法。第一个使用getset,第二个只需将控制修饰符设置为true。

当使用其中任何一个时,似乎Form1的设计器中的值不会更新,因此Form2仅将值读取为false,因为这是值默认情况下为复选框。

Form1

    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();
    }

Form2

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

        if (frm.CheckBox == true)
        {
            //Do whatever
        }
    }

这基本上就是我要做的一切。如果我做错了,或者有更好的方法,请告诉我。

谢谢。

4 个答案:

答案 0 :(得分:3)

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

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

 frm.ShowDialog(this);

通过执行此操作,您将Form2 Form1属性设置为Owner个实例。因此,您可以使用Form2 Form1属性访问当前实例。您还应将其强制转换为CheckBox以访问private void button1_Click(object sender, EventArgs e) { if (((Form1)Owner).CheckBox == true) { //Do whatever } } 属性。

{{1}}

答案 1 :(得分:0)

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

Form1 a = new Form1();
Form2 b = new Form2();

现在稍后在应用程序的生命周期中,用户单击表单2上的按钮 ,你拥有的是(伪代码):

// ... somewhere in "Form2" ...
private void button1_Click(object sender, EventArgs e) {
   Form1 c = new Form1();
   c.Checkbox = true;
}

问题是“c”与“a”Form1不同 - 它们是同一形式的两个不同实例。解决此问题的最简单方法是使您的复选框保持静态:

// in Form1...
public static bool CheckBox { get; set; }

现在,您只有一个复选框值,并且对于Form1的所有“副本”(实例)都是相同的。

备注

这有效,并不完美。如果你想要Form1的两个副本,并且你们每个人都不具备“CheckBox”的价值,那么这对你不起作用。相反,你需要做的是开始传递实例。因此,我在答案开头列出的代码需要更改为:

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;
   }
}

现在,您希望从FormB内部访问Form1的一个实例,只需使用“copyOfForm1”变量即可。这是关于实例/静态的所有内容的 FAR ,但希望它至少让你走上正确的轨道。祝你好运!

答案 2 :(得分:0)

在Form2上,将复选框值设为属性。关闭表单时,可以将DialogResult设置为OK。所以在form2的关闭事件或任何你想要的地方:

this.DialogResult = DialogResult.OK;

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

using (var form2 = new Form2())
{
    if (form2.ShowDialog() == DialogResult.OK)
    {
        var checkboxValue = form2.Checkbox;
    }
}

如果您不想关闭表单,可以将另一个bool属性设置为true,并在想要获取复选框的值时检查该属性。所以在form2中:

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;
    }
}

答案 3 :(得分:0)

更轻松的解决方案:

Form1:

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

if(CheckBox1.Checked == true)
{
File.WriteAllText("C:\\Checked.txt", "true");
}

Form2:

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

string GetResult = File.ReadLines("C:\\Checked.txt").First();

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