Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接收两个表单之间的bool变量时出错_C# - Fatal编程技术网

C# 接收两个表单之间的bool变量时出错

C# 接收两个表单之间的bool变量时出错,c#,C#,全部 我想从form1到form2接收checkbox1数据。我使用get和set方法来接收变量的含义。我用这个代码来做这个。但它不起作用。为什么?问题在哪里 表格1.cs ... namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

全部

我想从form1到form2接收checkbox1数据。我使用get和set方法来接收变量的含义。我用这个代码来做这个。但它不起作用。为什么?问题在哪里

表格1.cs

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

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 test = new Form2();
            test.checkBox1 = checkBox1.Checked;
            test.Show();
        }
    }
}
表格2.cs

    ...
namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            private bool data7;

            public Form2()
            {
                InitializeComponent();
            }

            public bool checkBox1 
            {
                get { return data7; }
                set { value = data7; } 
            }

            private void Form2_Load(object sender, EventArgs e)
            {
                if (data7 == true)
                {
                    label1.Text = "true";
                }
                else
                {
                    label1.Text = "false";
                }
            }
        }
    }
应该是

set { data7 = value; }
set { data7 = value; }

您的
设置
方法错误。应该是

set { data7 = value; }
Form2
显然将值存储在变量
data7
中,但不在复选框中。您必须执行类似的操作才能将其实际存储在复选框中

public bool checkBox1
{
    get { return myCheckBox.Checked; }
    set { myCheckBox.Checked = value; }
}
另一个问题是将用户输入的结果返回到
Form1
。由于您使用
test.Show()调用
Form2
此状态后的代码立即继续,无需等待
Form2
关闭。调用
test.ShowDialog()取而代之


在不阻塞
Form1
的情况下返回结果的另一个选项是使用事件。使用这个定义

public class Form2ResultEventArgs : EventArgs
{
    public Form2ResultEventArgs(bool checked)
    {
        this.Checked = checked;
    }

    public bool Checked { get; private set; }
}
Form2
中,您可以定义这样的事件

public event EventHandler<Form2ResultEventArgs> Form2Result;

private OnForm2Result(bool checked)
{
    var handler = Form2Result;
    If (handler != null) {
        handler(this, new Form2ResultEventArgs(checked));
    }
}

// Assuming that you have a OK button on Form2
private OkButton_Click (...)
{
    OnForm2Result(myCheckBox.Checked);
    this.Close();
}

更新

如果您只想设置标签,为什么不这样做呢

表格2

public void SetDisplay(bool value) {
    label1.Text = value.ToString();
}
表格一

var test = new Form2();
test.Form2Result += ProcessResult;
test.Show();

...

private void ProcessResult(object sender, Form2ResultEventArgs e)
{
    bool result = e.Checked;
    ...
}
var test = new Form2();
test.SetDisplay(checkBox1.Checked);
test.Show();

请注意,
InitializeComponent
Form2
的构造函数中被调用,因此标签存在于
newform2()之后。无需在
Form2\u Load

中这样做,我想建议,当创建设置为false或true的bool数据7时,我不在乎,因为当首次加载表单时,如果用户未设置复选框1,表单将崩溃。是的,我知道OP,在给定的代码中,设置了变量

private bool data7 = false;
我在下面的建议中包含了Fur Dworetzky的答案

...
namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        //give the variable a default value
        private bool data7=false;

        public Form2()
        {
            InitializeComponent();
        }

        public bool checkBox1 
        {
            get { return data7; }
            //Here is Furs Correction
            set { data7 = value; } 
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            if (data7 == true)
            {
                label1.Text = "true";
            }
            else
            {
                label1.Text = "false";
            }
        }
    }
}

如果您没有对get或set中的data7执行任何操作(例如验证),那么只需将其删除即可

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

                public bool checkBox1 { get; set; }

                private void Form2_Load(object sender, EventArgs e)
                {
                    if (checkBox1)
                    {
                        label1.Text = "true";
                    }
                    else
                    {
                        label1.Text = "false";
                    }
                }
            }

我可能弄错了,但我认为你已经相当多地过度阅读了这个问题。虽然你的回答是正确的,但我不相信你提供了Fur Dworetzky尚未提供的任何东西。OP不希望将变量存储为复选框,而是将其显示在标签中,并且从未要求将任何结果返回到Form1,因此不需要showDialog。是的,可能是这样。他将一个属性命名为checkBox1,但是当你给它赋值时,没有设置任何复选框!这是非常错误的。如果他只想设置一个标签,为什么不这样做:
public void SetDisplay(bool value){Label1.Text=value.ToString();}
?同意变量名的使用非常糟糕。