我有两个表单:MainForm
和OptionsForm
,它们有一个按钮(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,但它仍然没有用。任何消化?
答案 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
它还有额外的好处,即值将在应用程序的会话之间保存。