在主窗口和子窗口之间共享对象,作为来回传递数据的一种方式(c#)

本文关键字:窗口 数据 一种 方式 之间 共享 对象 | 更新日期: 2023-09-27 18:14:48

这个问题有三个文件:

  • Options.cs(选项值的数据存储)

  • MainWindow.cs(程序的主窗口,它的外观是根据options数据存储中的选项修改的-一旦类被声明为对象)

  • OptionsWindow.cs(用户设置选项值的子窗口,当用户按下窗口内的按钮时,此窗口然后将更改保存到Options数据存储中)

我想做的是在c#中的主窗口窗体和子窗口窗体之间共享数据。我的主窗口叫MainWindow,子窗口叫OptionsWindow

我有一个名为Options的数据存储。这是一个存储各种用户选项的对象。(有些类型为intbool)这些选项由MainWindow用于外观目的。

因此,用户在OptionsWindow中进行了更改,这些变量的更改保存在OptionsWindow中声明的Options类型的userOptions对象中。

我这样做是因为我需要一种简单的方法来移动子窗口中的集合数据,将这些数据保存到对象中然后在MainWindow

中使用这些数据

为什么不在MainWindow中声明userOptions对象?因为你不能访问任何在MainWindow中声明的数据,除非我把对象改成public,而每个人都说永远不要这样做。所以我试着在OptionsWindow内制作userOptions对象,并通过属性暴露变量(数据)。

这工作。我可以访问和设置OptionsWindowMainWindow的属性。

怎么了?好吧,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个小时,尝试了所有的东西。

所有我想要的是有各种类型的用户选项的数据存储,并使用选项窗口来设置选项和主窗口来读取选项。

这就是我想做的。

在子窗口中设置变量到共享数据存储中,并在主窗口中访问该数据存储。

数据存储为对象。

这个是可修复的吗?或者是否有更好的方法从子窗口获取数据,并且子窗口和主窗口都可以访问。

编辑:我最终将数据存储公开,因为代码变得太复杂了。

在主窗口和子窗口之间共享对象,作为来回传递数据的一种方式(c#)

尝试在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也不会被销毁。还有一点:如果你想结束你的程序,你必须关闭窗口(而不是隐藏它)。否则程序将继续运行