【问题标题】:Passing Forms a parameter and calling its events传递表单参数并调用其事件
【发布时间】:2018-05-22 09:10:05
【问题描述】:

MDIParent (frmMain) 窗体是带有菜单条的主窗口,其中包含 3 个菜单项,即 frmSales、frmProducts、frmCustomers。每个都是我需要调用的表单,而不是每次调用时都实例化。我已经成功地做到了这一点,但是我想创建一个将表单名称作为参数的方法,但我还需要为我传递给它的任何表单调用相应的 FormClose 事件。

这是 frmMain 中的代码,我试图通过在每次选择菜单条项目时简单地调用一个方法来最小化。为了清楚起见,我的代码按预期工作,但我希望看到创建的方法为此。

以下内容是凭记忆在记事本中输入的,所以可能会有一些错误,不过你会明白的:

frmSales SalesForm;
frmProducts ProductsForm;
frmCustomers CustormersForm;

private void ShowChildFormModal (Form myFormName)
{
    if(myFormName = null)
    {
        myFormName= new myFormName(); // is this correct ?
        myFormName.MDIParent = this; // referring to frMain - MDIParent

        // now i need to call the OnClosed Event for the form in the 
        // parameter so i can set it to null :
        myFormName_FormClose += EventHandler (FormClosed, EventArgs)  
        myFormName.Show()
    }
    else
    {
        myFormName.Activate();
    }
}

private void frmSales_OnClosed (object sender, EventArgs e)
{
    SalesForm = null;
}

private void frmProducts_OnClosed (object sender, EventArgs e)
{
    ProductsForm = null;
}

private void frmCustomers_OnClosed (object sender, EventArgs e)
{
    CustomersForm = null;
}

【问题讨论】:

  • “以下内容是凭记忆在记事本中输入的” - 不要那样做。确保您发布minimal reproducible example
  • 对此我深表歉意,我正坐在工作岗位上,与编码完全无关,正在考虑解决方案,也决定在这里提问。但如果我试图解释它,有人会要求查看代码,所以我尽我所能从内存中输入代码。
  • 这是asp.net代码吗?
  • c# windows 应用程序 - Visual Studio 2015

标签: c# .net winforms methods


【解决方案1】:

您可以使用带有表单名称及其表示形式的字典,如下所示:

SalesForm salesForm = new SalesForm();
ProuctsForm productForm = new ProuctsForm();
CustormersForm customerForm = new CustormersForm();



Dictionary <string,Form> MyForms = new Dictionary<string,Form>();

MyForms["sales"] = salesForm;

MyForms["products"] = productForm;

MyForms["customer"] = customerForm;

// Set Your properties and events you want here

private void ShowChildFormModal (string myFormName)
{
    if(myFormName = null && MyForms[myFormName] !=null)
    {       
        MyForms[myFormName].MDIParent = this; // referring to frMain - MDIParent

        MyForms[myFormName].myFormName_FormClose += EventHandler (FormClosed, EventArgs)  ;
        MyForms[myFormName].ShowModal();
    }
    else
    {
        // Else what you need to do ??
    }
}

【讨论】:

  • 谢谢,这是一个有趣的解决方案。我会尝试并给你反馈结果,这次我复制代码和结果:)
  • 很高兴看到你达到了什么目标
  • 比较我发布给你的代码,我做错了什么?我问的原因是,我将 Form 对象作为参数传递。我的方法和你的有什么不同?
  • 您调用参数 myFormName ,实际上表单名称是字符串以及如何检索它,您不再需要表单对象作为参数,只需通过名称即可获得所需的表单方法
  • 但是如果我有一个字符串作为参数,我如何在方法内为表单调用事件?或者这就是您将字符串名称用作字典中表单的键的原因?
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2020-12-15
相关资源
最近更新 更多