c#使用form1中form2的复选框

时间:2017-01-18 21:13:48

标签: c# checkbox reference

好的,这是一个简单的问题,但现在已经搁浅了我的大脑。

我有两种形式:Form1Form2

我在Form2上有一些复选框,我希望使用Form2Form1上选中的复选框中的数据,但是当我在Form1上添加以下代码时给我错误:

if (cbTESTING.Checked) 
{
    uri_testings += string.Format("{0}.TESTINGS,", word);
}

我在cbTESTING时遇到错误,因为它未在Form1上引用。

如何使用或引用Form2Form1的复选框?

5 个答案:

答案 0 :(得分:2)

我会做这样的事情:

由于Form1创建Form2,而Form1需要操作Form2,您可以从Form2.Designer.cs更改此内容:

private System.Windows.Forms.Checkbox cbTESTING;

要:

public System.Windows.Forms.Checkbox cbTESTING;

假设您在Form1中创建了Form2,如下所示:

Form2 f2 = Form2();
f2.Show();

然后使用它来检查cbTESTING

if(f2.cbTESTING.Checked) // do stuff  ;

编辑:我看到你的评论说它们根本没有关系,这使得用任何简单的方法都无法实现。你所说的意味着这两个THREADS之间的通信,因为每个FormThread中运行,并且这些线程是不相关的。沟通并不是一件容易的事,你可以使用UDPEvents来尝试,但请相信我,他们之间有直接关系可以让事情变得更容易。

无论如何,我会假设其他FormThread会启动这些Forms

答案 1 :(得分:1)

这是解决此问题的一种非常简洁的方法..只需将Form2中的private System.Windows.Forms.Checkbox cbTESTING; 的访问修饰符更改为public System.Windows.Forms.Checkbox cbTESTING; 即可。

即,在Form2.Designer.cs中,更改

Form1

public partial class Form1 : Form
{
    public Form1() {
        InitalizeComponent();

        Form2 secondForm = new Form2();
        bool isChecked = secondForm.cbTESTING.checked;
    }
}

然后,protected可能如下所示:

stream.Read()

修改已删除data == 0解决方案,在这种情况下,这不是一个很好的选择。

答案 2 :(得分:0)

可能不是最优雅的解决方案,但肯定会有效。在Form2中声明一个公共静态bool变量。将复选框更改的事件添加到您的复选框并相应地更改这些静态变量。然后只需检查Form1中的那些变量,例如Form2.VariableName,如果您需要进一步解释,请告诉我

修改

在Form2中默认声明public static bool CheckBoxStatus = false;为false,您可以更改它。

同样在Form2中添加以下事件checkBox1.CheckedChanged += new EventHandler(CheckedChanged)并添加适当的功能,例如

private void CheckedChanged(object sender, EventArgs e)
{
    CheckBoxStatus = checkBox1.Checked;
}

最后在Form1中你可以简单地检查是否选中了这个复选框

if(Form2.CheckBoxStatus == true) ;
else ;

希望有所帮助。 * PS对不起我的格式,不知道在这里发布答案。

答案 3 :(得分:0)

在这里你有一种丑陋的方式来做你想做的事:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

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

        label1.Text = frm.TextBoxChecked;
    }
}

//Just declare a prop into Form2 a set it with the value you need
public partial class Form2 : Form
{
    public string TextBoxChecked { get; set; }
    public Form2()
    {
        InitializeComponent();
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked)
            TextBoxChecked = "Checkbox_1_checked";
        else
            TextBoxChecked = "Checkbox_1_unchecked";
    }
}

让我们以一种很酷的方式做事。 也许对Form2说一个好的方法:“嘿,当你的复选框改变时让我知道”,这听起来像是一个回调。所以,试试吧:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void doWhenCheckBoxChange(string text)
    {
        //I'm receiving the notification indicating that the checkbox has changed
        label1.Text = text;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var frm = new Form2();
        //I'm passing a callback to Form2, Here is where I say 
        //"Hey you, let me know where your checkbox change"
        frm.DoWhenCheckboxChange = doWhenCheckBoxChange;
        frm.ShowDialog();

        //label1.Text = frm.TextBoxChecked;
    }
}

public partial class Form2 : Form
{
    //public string TextBoxChecked { get; set; }
    public Action<string> DoWhenCheckboxChange;
    public Form2()
    {
        InitializeComponent();
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        //TextBoxChecked = "Checkbox_1";
        //Notify to Form1 that checkbox has changed.
        if (checkBox1.Checked)
            DoWhenCheckboxChange("Checkbox_1_checked");
        else
            DoWhenCheckboxChange("Checkbox_1_unchecked");
    }
}

如果您测试第二个aproache,您会发现不需要关闭Form2来查看更改。

答案 4 :(得分:0)

我设法通过使复选框在属性设置默认值中保存值然后每次我想打开程序而不是再次单击它来调用它来实现这一点它自动保存了我的当前值。

感谢大家的帮助。

以下是一些代码供将来参考,如果有其他人想按照我的方式去做。

以下是将其保存到设置中的代码。

            if (cbTESTING.Checked)
            Properties.Settings.Default.cbTESTING = true;
        else
            Properties.Settings.Default.cbTESTing = false;

以下是以不同形式调用它的代码。

                if (Properties.Settings.Default.cbTESTING == true)
            {
                uri_domains += string.Format("{0}.testing,", word);
            }

希望这将有助于将来的某个人!