将设置从一个Windows窗体传递到另一个窗体

时间:2014-12-12 19:19:53

标签: c# visual-studio windows-forms-designer

我有一个带有复选框的表单,如果选中,那么不同表单中的文本将全部为大写。我认为我的问题是我每次都创建一个新实例,只想获取复选框的当前状态。

 public partial class Form4 : Form
{
    public bool bChecked = false;

    public Form4()
    {
        InitializeComponent();
    }

    private void Form4_FormClosed(object sender, FormClosedEventArgs e)
    {
        Properties.Settings.Default.checkbox = checkBox1.Checked;
        Properties.Settings.Default.Save();
    }

    private void Form4_Load(object sender, EventArgs e)
    {
        checkBox1.Checked = Properties.Settings.Default.checkbox;
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if(checkBox1.Checked)
        {
            bChecked = true;
        }
    }
}

public partial class Form3 : Form
{
    Form4 frm4 = new Form4();
    public Form3()
    {
        InitializeComponent();
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if(frm4.bChecked.Equals(true))
        {
            textBox1.CharacterCasing = CharacterCasing.Upper;
        }

    }


}

1 个答案:

答案 0 :(得分:0)

不要创建Form4的新实例:

Form4 frm4 = new Form4();

然后它不是指当前的实例,而是指一些从未向用户显示的新的内存实例。

相反,需要引用构造函数上的实例:

Form4 frm4;

public Form3(Form4 form4Instance)
{
    InitializeComponent();
    frm4 = form4Instance;
}

在您的应用程序的其他位置,当您创建并显示Form3时,您需要为现有Form4提供参考:

Form3 frm3 = new Form4(someReferenceToForm4);
frm3.Show();

您可以采取一些方向。例如,如果Form3需要Form4的引用,但有时可以使用一个,则提供两个构造函数:

public Form3()
{
    InitializeComponent();
}

public Form3(Form4 form4Instance)
{
    InitializeComponent();
    frm4 = form4Instance;
}

在使用之前执行null检查:

if (frm4 != null)
    if (frm4.bChecked.Equals(true))
        textBox1.CharacterCasing = CharacterCasing.Upper;

但重点是,您需要对实际已存在的对象的引用。 Form4不是对象,它是创建对象的蓝图。如果你创建第二个,它不是同一个对象。它可能是相同的,因为从同一计划建造的两栋房屋是相同的。但他们不是同一所房子。