2

这个问题有三个文件:

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

  • MainWindow.cs(程序的主窗口,它的外观根据 Options 数据存储区中的选项进行修改 - 一旦该类被标记为对象)

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

我想要做的是在 C# 中的主窗口窗体和子窗体窗体之间共享数据。我的主窗口被称为MainWindow子窗口OptionsWindow

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

因此,用户在 中进行更改,OptionsWindow这些变量更改保存在userOptions类型的对象中OptionsOptionsWindow.

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

为什么我没有在userOptions里面声明对象MainWindowMainWindow因为除非我制作public每个人都说永远不会做的对象,否则您无法访问声明的任何数据。所以我尝试制作userOptions内部制作对象OptionsWindow并通过属性公开变量(数据)。

这行得通。我可以从两者访问和设置OptionsWindow属性MainWindow

有什么问题?好吧,optionsWindow.Show();只能使用一次,之后 C# 将不会让它再次工作,所以由于某种原因它只能使用一次。此外,一旦表单关闭,似乎对象userOptions正在被销毁。

MainWindow.cs

public partial class MainWindow : Form
    {
        OptionsWindow optionsWindow = new OptionsWindow();

optionsWindow然后声明一个userOptions类型的对象Options。这是数据存储。剩下的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 个小时,尝试了一切。

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

这就是我想做的。

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

数据存储是一个对象。

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

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

4

2 回答 2

0

您可以制作Options单独的(静态)配置或数据存储类。这样你可以在任何地方使用它。或者,您创建它MainWindow并通过构造函数或其他方法将其提供给OptionWindow.

关于Show()in OptionWindow- 您可以订阅它的Closing事件(从内部)并将其设置为取消(FormClosingEventArgs),然后隐藏()这个窗口。这种方式OptionWindow不会被破坏,并且可以随时再次显示。此外, userOptions 不会被破坏。不过还有一点:如果你想结束你的程序,你必须真正关闭窗口(而不是隐藏它)。否则程序将继续运行。

于 2013-05-21T08:38:32.570 回答
0

尝试将 Options 属性添加到您的 OptionsWindow 表单。

public partial class OptionsWindow : Form
{
    public Options { get; set; }

    public bool AllowToolTip
    {
        get { return Options.AllowToolTips; }
        set { Options.AllowToolTips = value; }
    }
}

在您的 MainWindow 中,您只需设置选项并在完成后阅读。

private void optionsToolStripMenuItem1_Click(object sender, EventArgs e)
{
        optionsWindow.Options = myOptions;
        optionsWindow.ShowDialog();
        myOptions = optionsWindow.Options;

}
于 2013-05-21T08:49:59.267 回答