我可以单独填写表格吗?

本文关键字:表格 单独填 我可以 | 更新日期: 2023-09-27 17:53:21

我有一个Visual c# 2010应用程序,它有一个名为MainWnd的主窗体,还有其他工具窗口和对话框。我希望其他工具窗口能够与主窗体"对话",并调用其方法。但这需要MainWnd的实例,并且由于在任何给定时间只会创建这些形式中的一个,因此我没有理由枚举MainWnd的所有实例或查找第一个实例。所以我希望我的主要应用程序形式MainWnd是一个单例,这样其他窗口可以很容易地从它调用代码。

下面是主要形式的代码,我想做一个单例:

using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace MyLittleApp
{
    public partial class MainWnd : Form
    {
        public MainWnd()
        {
            InitializeComponent();
        }
        public void SayHello()
        {
            MessageBox.Show("Hello World!");
            // In reality, code that manipulates controls on the form
            // would go here. So this method cannot simply be made static.
        }
    }
}

我希望能够从另一种形式调用SayHello(),只需写:

MainWnd.SayHello();

我怎样才能做到这一点?

我可以单独填写表格吗?

您可能会找到一种使主窗口成为单例的方法,但是这并不是实现您想要的结果的最佳方法,也不是使用单例模式的合适情况。

如果所有其他工具窗口/对话框都被封装在主窗口中,那么用于通信的更好的模式将是事件。

让内部窗口/对话框引发事件来代表主窗口做某事的"请求"。让主窗口订阅这些事件,并通过事件处理程序完成工作。

通过避免单例方法,您可以避免测试单例的困难,以及避免广泛的显式循环引用,其中不仅主窗口有对封装窗口/对话框的引用,而且它们反过来又有对主窗口的显式引用。

见下文

using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace MyLittleApp
{
    public partial class MainWnd : Form
    {
       public static MainWnd Instance;
        public MainWnd()
        {
            Instance = this;
            InitializeComponent();
        }
        public void SayHello()
        {
            MessageBox.Show("Hello World!");
            // In reality, code that manipulates controls on the form
            // would go here. So this method cannot simply be made static.
        }
    }
}

现在可以在代码的任何地方通过调用MainWnd.Instance来使用它它的所有成员也可用于实例。

你当然可以这么做。

 public MainWnd Instance = new MainWnd();

则作为MainWnd.Instance.SayHello()访问。

替换以下调用

MainWind instance = new MainWnd();

 MainWnd instance = MainWnd.Instance;

我不确定Visual Studio设计师如何在构造函数为私有后做出反应。但如果不允许,这将是Visual Studio的问题,而不是语言/编译器的问题。