C# 在表单之间传递数据

C# 在表单之间传递数据,c#,winforms,C#,Winforms,我的项目中有3个winforms,在Form3上有一个复选框。我希望能够做的是单击此复选框,然后当表单退出时,对Form1中的表单进行相同的检查(无论是否选中)。我现有的代码如下所示,但它就是不起作用,我是不是遗漏了一个技巧?谢谢 //Form3 Form1 setDateBox = new Form1(); setDateBox.setNoDate(checkBox1.Checked); //Form1 public void setNoDate(bool isChecked) {

我的项目中有3个winforms,在Form3上有一个复选框。我希望能够做的是单击此复选框,然后当表单退出时,对Form1中的表单进行相同的检查(无论是否选中)。我现有的代码如下所示,但它就是不起作用,我是不是遗漏了一个技巧?谢谢

//Form3

Form1 setDateBox = new Form1();
setDateBox.setNoDate(checkBox1.Checked);

//Form1

public void setNoDate(bool isChecked)
{
    checkBox1.Checked = isChecked;
}

checkBox1
Form3
的成员,因此在
Form1
中不能以这种方式引用它

你可以:

  • 创建一个单独的类,在表单中共享,该类保留影响整个应用程序的值
  • 使
    Form3.checkBox1
    公开可见,以便您可以通过
    myForm3Instance.checkBox1

在包含复选框的表单的设计器中,将其设置为内部或公共。然后可以从forms对象访问该控件。这是一个快速而肮脏的实现方式,但它可能会解决你的问题

ex 
In form1.designer.cs
existing
private CheckBox checkbox1;

new one

internal CheckBox checkbox1; or
public CheckBox checkbox1;

您正在创建Form1的新实例,而不是引用它的现有实例

Form1 setDateBox = (Form1)this.Owner

这将解决您的问题。

有两种方法:

1-将Form1变量“setDateBox”存储为Form3的类成员,然后从CheckedChanged事件处理程序中的复选框访问“setNode”方法:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    setDateBox.setNoDate(checkBox1.Checked);
}
2-如果不希望将setDateBox存储为类成员,或者需要更新多个表单,可以在Form3中定义一个事件,如下所示:

public event EventHandler<CheckedChangedEventArgs> CheckBox1CheckedChanged;

...

public class CheckedChangedEventArgs : EventArgs
{
    public bool CheckedState { get; set; }

    public CheckedChangedEventArgs(bool state)
    {
        CheckedState = state;
    }
}
创建表单后分配事件处理程序:

Form1 setDateBox = new Form1();
CheckBox1CheckedChanged += new EventHandler<CheckedChangedEventArgs>(setDateBox.Form1_CheckBox1CheckedChanged);

希望这能有所帮助。

您应该为表单和控件命名。@Slaks,是的,我应该,如何在vs中更改表单的名称,以便代码中使用名称Form1的所有内容都被更改?重命名表单时,Visual Studio将自动重命名对它的所有引用。
Form1 setDateBox = new Form1();
CheckBox1CheckedChanged += new EventHandler<CheckedChangedEventArgs>(setDateBox.Form1_CheckBox1CheckedChanged);
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if(CheckBox1CheckedChanged != null)
        CheckBox1CheckedChanged(this, new CheckedChangedEventArgs(checkBox1.Checked));
}