在两种形式之间接收bool变量时会出错

时间:2012-05-16 12:33:25

标签: c#

所有

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

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

form2.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";
                }
            }
        }
    }

4 个答案:

答案 0 :(得分:9)

set { value = data7; }  

应该是

set { data7 = value; }

答案 1 :(得分:1)

您的set方法错误。它应该是

set { data7 = value; }

Form2显然将值存储在变量data7中,但不存储在CheckBox中。您必须执行类似的操作才能将其实际存储在CheckBox中

public bool checkBox1
{
    get { return myCheckBox.Checked; }
    set { myCheckBox.Checked = value; }
}

另一个问题是将用户输入的结果返回给Form1。由于您使用Form2调用test.Show();,因此此法规后的代码会立即继续,而不会让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();
}

在Form1中

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

...

private void ProcessResult(object sender, Form2ResultEventArgs e)
{
    bool result = e.Checked;
    ...
}

<强>更新

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

在Form2中

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

在Form1中

var test = new Form2();
test.SetDisplay(checkBox1.Checked);
test.Show();

请注意,InitializeComponent的构造函数中会调用Form2,因此标签位于new Form2()之后。无需在Form2_Load中执行此操作。

答案 2 :(得分:0)

我想建议当创建设置值为false的bool data7时,或者我不关心,因为如果用户没有设置CheckBox1,表单首次加载时Form会崩溃。是的,我知道OP在给出的代码中确实设置了变量。

private bool data7 = false;

我在下面的建议中包含了Fur Dworetzkys答案

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

答案 3 :(得分:0)

如果你没有在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";
                    }
                }
            }