【问题标题】:Open MdiForm from Usercontrol从用户控件打开 MdiForm
【发布时间】:2020-10-24 10:51:05
【问题描述】:

我有 MainForm、ChildForm 和 usercontrol1。我将 usercontrol1 嵌入到 Mainform。 usercontrol1 中有一个按钮。单击按钮时,我想打开 ChildForm(作为 mdiform)。 ChildForm 已最大化打开。我想始终显示 MainForm 标题栏。 我尝试了这里的代码,但它不起作用。此代码在 usercontrol1 的按钮单击事件中

ChildForm t = new ChildForm ();

            MainForm m = new MainForm();
            t.MdiParent = m; //Also I tried 'this' too
            t.Dock = DockStyle.Fill;
            t.Show();

谢谢

【问题讨论】:

  • 当然不要创建 new 主窗体,您要使用现有的主窗体。如果您根本无法获得对它的引用,那么 Application.OpenForms[0] 将无法获得它。一般来说,用户控件不应该自己创建新窗口。他们应该引发一个事件。当然,父母可以轻松订阅事件并获得对主窗口的引用。
  • @HansPassant 我不确定我是否同意你的观点,即 UC 不应该创建新表单。我已经看到UserControl(继承自Button)被开发来封装反射加载Form控件的过程(或者如果提供的对象没有创建Form并添加UserControl) t 继承自 Form),节省了大量时间在 Click 事件中重写相同的代码。
  • 所以你以前见过糟糕的代码,这并不能证明什么。如果它是如此优越,那么公开一个公共方法当然是一种允许父级在其事件处理程序中重用该代码的简单方法。或者不做自己的事情,事件的重点。

标签: c# winforms


【解决方案1】:

在您的MainForm 中,创建一个Singleton,然后您的代码将如下所示: 主窗体代码:

private static MainForm _Instance;
public static MainForm Instance
{
    get
    {
        if (_Instance == null)
        {
            _Instance = new MainForm();
        }
        return _Instance;
    }
}

事件代码:

ChildForm t = new ChildForm();
t.MdiParent = MainForm.Instance; 
t.Dock = DockStyle.Fill;
t.Show();

【讨论】:

  • 我已经添加了一个我使用的单例的例子,你能比较一下吗(这是在 VS2013 和 .Net 4.0 中工作的)。
  • 我出错了; "System.Windows.Forms.dll 中发生了类型为 'System.InvalidOperationException' 的未处理异常"
【解决方案2】:

您可以使用ActiveForm 获取当前MDIForm Actived:

ChildForm t = new ChildForm ();
MainForm m = new MainForm();
t.MdiParent = m.ActiveForm;
t.Show();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2011-01-12
    • 2014-09-20
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多