保持二级表格的价值

时间:2013-09-04 17:44:44

标签: c# .net winforms

我有两个表单:MainFormOptionsForm,它们有一个按钮(OK),可以在MainForm上应用一些更改。当我第一次打开OptionsForm时,一切正常,使用默认值。

在我进行一些更改并单击“确定”后,会应用选项,但是当我第二次打开OptionsForm时,我想保留以前的值,而不是像发生的那样默认值。

OptionsForm通过MainForm打开,就像这样

OptionsForm formOptions = new OptionsForm();
if (formOptions.ShowDialog(this) == DialogResult.OK)
{
    // etc..
}

//...

public string otherLabel
    {
        get { return formMainLabel.Text; }
        set { formMainLabel.Text = value; }
    }

在OptionsForm中,我有一个NumericUpDown,想要保持其值

private MainForm mainForm = null;
public OptionsForm(Form callingForm)
{
    mainForm = callingForm as MainForm;
    InitializeComponent();
}
// ...
private void btnOK_Click(object sender, EventArgs e)
{
     this.mainForm.someLabel= someBox.Value.ToString(); // NumericUpDown
     this.mainForm.otherLabel = "abc";       //>>> Getting NullReferenceException
     this.Close();
}

现在我可以保留我的设置,但我得到NullReferenceException。我试过this,但它仍然没有用。任何消化?

6 个答案:

答案 0 :(得分:5)

已经制作了ShowDialog()来支持这一点。它与Show()不同,除了它是模态之外,它还可以防止在用户关闭它时处理表单对象。因此,您可以再次调用ShowDialog(),控件保留其原始值:

    private OptionsForm options = new OptionsForm();

    private void button1_Click(object sender, EventArgs e) {
        if (options.ShowDialog(this) == DialogResult.OK) {
            // etc..
        }
    }

    protected override void OnFormClosed(FormClosedEventArgs e) {
        options.Dispose();
        base.OnFormClosed(e);
    }

答案 1 :(得分:1)

好吧,你应该将这些值传递给OptionsForm,随意为OpptionsForm编写自定义构造函数,并在需要时调用它。

答案 2 :(得分:1)

一种方法是始终保持对FormOptions的引用并显示相同的实例,而不是每次都创建一个新实例。或者,如果您不想这样做,您可以创建一个存储所有选项的Options类,然后可以将其存储并传递到您之后创建的任何新实例中。两者都有优点和缺点,因此可以随意选择最适合您需求的选项。

public class MyOptions
{
    public String StringOption { get; set; }
    public int IntOption { get; set; }
}

您的FormOptions将有一个MyOptions属性,您可以在其中设置所有选项并检索它们。

public class FormOptions : Form
{
    ...
    private MyOptions _options;
    public MyOptions Options 
    {
        get { return _options;}
        set
        {
            _options = value;
            // Set the Form's control values accordingly.
        }
    }
    ...
}

最后,你会在你的代码中这样称呼它:

    FormOptions optionsForm = new FormOptions();
    MyOptions savedOptions = new MyOptions(); // Probably don't want to create a new instance every time but I'm sure you get the idea here.
    optionsForm.Options = savedOptions;
    optionsForm.ShowDialog();

    // Get the new options after the form is closed.
    savedOptions = optionsForm.Options;

答案 3 :(得分:1)

如果你只想保留一个数字上/下控制的值,那么只需将它作为参数传递给构造函数。

public FormOptions(MainForm -mainFrm, int curNumericValue)
{
    someBox.value = curNumericValue;
}

并使用MainForm

中的值实例化表单
private void button1_click(....)
{
    FormOptions formOptions = new FormOptions(this, Convert.toInt32(someLabel.text));
    formOptions.ShowDialog();
}

答案 4 :(得分:0)

好像你正在通过这样的点击事件调用选项表单的实例:

button1_click(object sender, EventArgs e)
{
    OptionsForm optForm = new OptionsForm();
    optForm.showDialog();
}

您必须为Mainform类中的选项表单类创建变量,在那里实例化它或在构造函数中,并且只调用ShowDialog()中的Show()button_Click方法事件。像这样:

partial class MainForm:Form
{
    OptionsForm optForm;
    ............
    ............
    public MainForm()    //Constructor
    {
        initialiseComponent();
        optForm = new OptionsForm();
        ........
    }

    .......

    private button1_Click(object sender, EventArgs e)
    {
        optForm.Show();    // or ShowDialog()
    }
}

并在选项表单中使用this.hide()而不是this.close()..否则表单将被处理..

答案 5 :(得分:0)

为什么不使用构建属性中可用的“设置”和WinForms本身?只需让您的设置表单填充这些变量,并在单击“确定”时“设置”它们。然后在SettingsForm完全关闭后从这些设置刷新MainForm。容易,没有混乱,表格之间没有传递变量。

概述:http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

SO问题涵盖设置:Save Settings in a .NET Winforms Application

它还有额外的好处,即值将在应用程序的会话之间保存。