在主窗口和子窗口之间共享对象,作为来回传递数据的一种方式(c#)
本文关键字:窗口 数据 一种 方式 之间 共享 对象 | 更新日期: 2023-09-27 18:14:48
这个问题有三个文件:
-
Options.cs
(选项值的数据存储) -
MainWindow.cs
(程序的主窗口,它的外观是根据options数据存储中的选项修改的-一旦类被声明为对象) -
OptionsWindow.cs
(用户设置选项值的子窗口,当用户按下窗口内的按钮时,此窗口然后将更改保存到Options
数据存储中)
我想做的是在c#中的主窗口窗体和子窗口窗体之间共享数据。我的主窗口叫MainWindow
,子窗口叫OptionsWindow
。
我有一个名为Options
的数据存储。这是一个存储各种用户选项的对象。(有些类型为int
和bool
)这些选项由MainWindow
用于外观目的。
因此,用户在OptionsWindow
中进行了更改,这些变量的更改保存在OptionsWindow
中声明的Options
类型的userOptions
对象中。
我这样做是因为我需要一种简单的方法来移动子窗口中的集合数据,将这些数据保存到对象中然后在MainWindow
为什么不在MainWindow
中声明userOptions
对象?因为你不能访问任何在MainWindow
中声明的数据,除非我把对象改成public
,而每个人都说永远不要这样做。所以我试着在OptionsWindow
内制作userOptions
对象,并通过属性暴露变量(数据)。
这工作。我可以访问和设置OptionsWindow
和MainWindow
的属性。
怎么了?好吧,optionsWindow.Show();
只能使用一次,之后c#将不会让它再次工作,所以出于某种原因,它只能使用一次。而且,一旦窗体关闭,对象userOptions
似乎就会被销毁。
MainWindow.cs
public partial class MainWindow : Form
{
OptionsWindow optionsWindow = new OptionsWindow();
然后, optionsWindow
声明一个类型为Options
的对象userOptions
。这是数据存储。optionsWindow
的其余部分是获取用户数据并将这些数据添加到选项数据存储
public partial class OptionsWindow : Form
{
Options userOptions = new Options();
public bool AllowToolTip
{
get { return userOptions.AllowToolTips; }
set { userOptions.AllowToolTips = value; }
}
我这样调用optionsWindow
:(注意这只工作一次,因为异常错误,显然c#不能重用子对象。这真的让我很困惑)
private void optionsToolStripMenuItem1_Click(object sender, EventArgs e)
{
try
{
optionsWindow.Show();// this stops working after first call
}
catch { };
}
我已经在这个代码上工作了大约4个小时,尝试了所有的东西。
所有我想要的是有各种类型的用户选项的数据存储,并使用选项窗口来设置选项和主窗口来读取选项。
这就是我想做的。
在子窗口中设置变量到共享数据存储中,并在主窗口中访问该数据存储。
数据存储为对象。
这个是可修复的吗?或者是否有更好的方法从子窗口获取数据,并且子窗口和主窗口都可以访问。
编辑:我最终将数据存储公开,因为代码变得太复杂了。
尝试在OptionsWindow窗体中添加Options属性。
public partial class OptionsWindow : Form
{
public Options { get; set; }
public bool AllowToolTip
{
get { return Options.AllowToolTips; }
set { Options.AllowToolTips = value; }
}
}
在主窗口中,您只需设置选项并在完成时读取它。
private void optionsToolStripMenuItem1_Click(object sender, EventArgs e)
{
optionsWindow.Options = myOptions;
optionsWindow.ShowDialog();
myOptions = optionsWindow.Options;
}
您可以使Options
成为一个单独的(静态)配置或数据存储类。这样你就可以在任何地方使用它。或者您可以从MainWindow
创建它,并通过构造函数或其他方法提供给OptionWindow
。
关于OptionWindow
中的Show()
-您可以订阅它的Closing
事件(从自身内部)并将其设置为取消(FormClosingEventArgs
),然后隐藏()此窗口。这样OptionWindow
就不会被破坏,可以随时显示。同样,userOptions也不会被销毁。还有一点:如果你想结束你的程序,你必须关闭窗口(而不是隐藏它)。否则程序将继续运行