C# 组织事件处理程序方法

C# 组织事件处理程序方法,c#,asp.net,delegates,event-handling,C#,Asp.net,Delegates,Event Handling,我在web表单中使用asp.net和c# 它使用VisualStudio为我的控件自动创建事件处理程序方法。 VS以这种方式生成方法名idControl\u event。我知道我可以给事件处理程序方法起任何名字 所以我想知道你最喜欢的命名主题的方法是什么 我想知道是否可以使用Web窗体在单独的类中编写事件处理程序方法(而不是在特定网页的代码隐藏中),以及如何从控件调用主题 谢谢您的时间。我不认为您可以在另一个类中使用事件处理程序,您可以得到的最好结果可能是在一个单独的部分类文件中我不认为您可

我在web表单中使用asp.net和c#

它使用VisualStudio为我的控件自动创建事件处理程序方法。 VS以这种方式生成方法名
idControl\u event
。我知道我可以给事件处理程序方法起任何名字

  • 所以我想知道你最喜欢的命名主题的方法是什么

  • 我想知道是否可以使用Web窗体在单独的类中编写事件处理程序方法(而不是在特定网页的代码隐藏中),以及如何从控件调用主题


谢谢您的时间。

我不认为您可以在另一个类中使用事件处理程序,您可以得到的最好结果可能是在一个单独的部分类文件中

我不认为您可以在另一个类中使用事件处理程序,您可以得到的最好结果可能是在一个单独的部分类文件中

对于事件处理程序名称,我通常使用VisualStudio默认生成的格式:[idControl]\uEventName]。但这在很大程度上是个人/团队的偏好。我见过类似的讨论,比如or。无论您选择如何命名事件处理程序,我认为最重要的是保持一致性

至于将事件处理程序放在代码之外,我并不经常看到这样做,但这是可能的。最简单的方法是在具有公共事件处理逻辑的单独类中使用静态方法。例如,下面是如何在单独的类中加载Page.的标准逻辑。我相信您需要通过代码注册事件处理程序-我不认为您可以在标记(aspx)中注册

然后在要使用该公共事件处理程序的页面的代码隐藏中:

public partial class WebForm1 : System.Web.UI.Page
{
    public WebForm1()
    {
        //Register the handler via code in the constructor
        Load += CommonEventHandlers.Page_Loaded;
    }
}

作为另一种选择,您可以使用继承来帮助代码重用。例如,您可以有一个基类,页面从该基类继承,该基类具有标准处理程序。这样做的一个好处是,即使方法是在基类中声明的,也可以在标记中注册事件处理程序,因此不需要在祖先页面的代码隐藏中执行任何操作

对于事件处理程序名称,我通常使用VisualStudio默认生成的格式:[idControl]\uEventName]。但这在很大程度上是个人/团队的偏好。我见过类似的讨论,比如or。无论您选择如何命名事件处理程序,我认为最重要的是保持一致性

至于将事件处理程序放在代码之外,我并不经常看到这样做,但这是可能的。最简单的方法是在具有公共事件处理逻辑的单独类中使用静态方法。例如,下面是如何在单独的类中加载Page.的标准逻辑。我相信您需要通过代码注册事件处理程序-我不认为您可以在标记(aspx)中注册

然后在要使用该公共事件处理程序的页面的代码隐藏中:

public partial class WebForm1 : System.Web.UI.Page
{
    public WebForm1()
    {
        //Register the handler via code in the constructor
        Load += CommonEventHandlers.Page_Loaded;
    }
}

作为另一种选择,您可以使用继承来帮助代码重用。例如,您可以有一个基类,页面从该基类继承,该基类具有标准处理程序。这样做的一个好处是,即使方法是在基类中声明的,也可以在标记中注册事件处理程序,因此不需要在祖先页面的代码隐藏中执行任何操作

正如@Daniel Powell所说,我很确定,处理事件的最好方法是将它们作为代码隐藏的部分类放在不同的文件中


关于命名约定,95%的时间我看到事件被命名为您所说的-
idControl\u event
。这就是我命名它们的方式,因为当我查看源代码时,可以很容易地将代码绑定到控件。

正如@Daniel Powell所说,我非常确定,处理事件的最好方法是将它们作为代码隐藏的部分类放在不同的文件中


关于命名约定,95%的时间我看到事件被命名为您所说的-
idControl\u event
。这就是我命名它们的方式,因为当我查看源代码时,很容易将代码绑定到控件。

OP是否也需要将AutoEventWireup设置为false才能使用此选项?@Tim-
AutoEventWireup
不会影响此方法。但是,如果您碰巧在页面中有一个名为
Page\u Load
的方法,并且
AutoEventWireup
true
,则该
Page\u Load
方法和
CommonEventHandler
中的方法都将被调用。但我认为这是意料之中的——甚至可能是在您想要一些标准处理(在
CommonEventHandlers
中)和定制处理(在
Page\u Load
中)的情况下所期望的。有趣。如果事件的触发顺序总是已知的,并且保证是相同的(即,代码隐藏在CommonEventHandlers之后),这可能会导致一些有趣的设计可能性。虽然我仍然不确定是否会有更好的方法。关于AutoEventWireup的更多解释可以在理论上在这里找到,但我不相信订单是有保证的。但在实践中,事件处理程序是按照它们注册的顺序调用的(只是不要引用我的话)。因此,在上述情况下,将首先调用“CommonEventHandler”(它在构造函数中注册,这比发生AutoEventWireup时要早得多)。无论哪种方式,我都同意拥有多个依赖于特定顺序的事件处理程序是一个坏迹象。OP是否还需要将AutoEventWireup设置为false才能使用此选项?@Tim-
AutoEventWireup
不会影响此方法。但是,如果您碰巧在页面中有一个名为
Page\u Load
的方法,并且
AutoEventWireup
true
,则该
Page\u Load
方法和
CommonEventHandler
中的方法都将被调用。但我认为这是意料之中的——甚至可能是你想要一些标准程序的情况下所期望的