表单设计器和命名空间

时间:2012-04-18 04:14:31

标签: c# visual-studio-2010

我在DLL中经常使用静态事件 - Toolkit.Dialogs.ExitConfirm

我可以使用此事件的唯一方法是修改在form.Designer.cs中添加事件的行。例如:

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

变为

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Toolkit.Dialogs.ExitConfirm);

如果我尝试通过Properties-> Events页面添加它,它会给我这个错误:'Toolkit.Dialogs.ExitConfirm'不是有效的标识符。

有没有办法允许表单设计器引用其他类/命名空间中的事件?

编辑:有些人使用视觉提示更好地工作,所以这里有一些图像来定义问题:http://imgur.com/a/RaLMg

第一张图显示了我必须如何使它在Visual Studio中运行 - 一个调用事件的事件。

第二张图片展示了我实际上要做的事情。

第三个图像是我手动输入方法名称时发生的错误。

3 个答案:

答案 0 :(得分:1)

  

我在DLL中有一个静态事件

你没有,你只有一个方法。 FormClosing是事件,如果它具有正确的签名,则您的方法可以是事件处理程序方法。设计师根本不支持您尝试做的事情,您将不得不停止尝试。有两种理智的解决方案,都涉及在表单类中编写代码。首先,您可以在构造函数中执行此操作:

    public Form1() {
        InitializeComponent();
        this.FormClosing += Toolkit.Dialogs.ExitConfirm;
    }

或者理智的一个,因为一个班级听听自己的事件是没有意义的:

    protected override void OnFormClosing(FormClosingEventArgs e) {
        Toolkit.Dialogs.ExitConfirm(this, e);
        if (!e.Cancel) base.OnFormClosing(e);
    }

当您从这个窗体派生另一个窗体时,它具有正常工作的巨大优势。这也是你可能应该做的事情的强烈暗示。看起来您正在尝试编写对话框的公共代码。 “Toolkit”命名空间同样重要。通过让此工具包实现基本表单类,使其工作正常。现在,您可以设计表单类,而无需任何代码或事件处理程序:

public partial class Form1 : Toolkit.Dialogs.BaseDialog {
   // etc
}

假设Toolkit.Dialogs.BaseDialog是一个派生自Form的类,它重写了OnFormClosing()。也许它还应该有一个名为“ConfirmOnClose”的bool类型的公共属性。它启用“ExitConfirm”逻辑。您可以毫无困难地在设计器中设置那个属性。

答案 1 :(得分:0)

您可以调用此方法'Toolkit.Dialogs.ExitConfirm'在申请表的表单结束事件上,并将所需的参数传递给Toolkit.Dialogs.ExitConfirm

答案 2 :(得分:0)

WinForms设计器并不是为此而设计的。我有点意外,下次你在设计师做出改变时不会丢失你的活动。

关于其他方法可以做到这一点的一些想法:

  • 您可以创建一个Form类来为您挂钩事件,并从该基类中下载所有其他表单。那你到处都会有这种行为。
  • 您可以创建一个为您挂钩事件的实用程序方法,并从每个表单的构造函数中调用它。
  • 你可以制作一个挂钩事件的扩展方法,然后显示表单,并在显示表单的任何地方调用扩展方法(而不是调用Show)。

基类可能是最简单的解决方案,只要您尚未将表单继承用于其他目的。

相关问题