ASP.NET中实现定制自己的委托和事件参数类

2025-05-29 0 84

本文实例讲述了ASP.NET中实现定制自己的委托事件参数的方法,对于学习ASP.NET有很好的参考借鉴价值。具体方法如下:

一般在实际开发中,对于事件不需要传递数据信息时,像上面的KingTextBox控件的事件,在引发事件时传递的参数为EventArgs.Empty,如下所示:

?

1
OnTextChanged(EventArgs.Empty);

这是因为控件KingTextBox的TextChanged事件比较简单,这里不需要参数对象传递数据。但像一些复杂的控件比如GridView的按钮命令事件,必须得有参数命令表示单击了哪个按钮;翻页事件,需要EventArgs参数对象把当前页信息传递到页面后台代码的事件体的第二个参数中,然后开发人员根据此页参数从数据库取得对应页的数据;还有像ItemDataBound事件,也需要把当前Row信息和索引等数据作为EventArgs参数传递到事件实例中。

当遇到以上这些情况,我们就需要定义自己的事件参数委托,而不使用默认的System.EventArgs。下面就以Grid控件的翻页功能说明一下定义事件参数委托的方法,请看以下代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31
/// <summary>

///

/// </summary>

public delegate void GridPageChangedEventHandler(object source, GridPage ChangedEventArgs e);

public class GridPageChangedEventArgs : System.EventArgs

{

public GridPageChangedEventArgs()

{

}

private int intCurrentPageIndex;

public new int CurrentPageIndex

{

get { return intCurrentPageIndex; }

set { intCurrentPageIndex = value; }

}

private int intPageCount;

public new int PageCount

{

get { return intPageCount; }

set { intPageCount = value; }

}

private int intPageSize;

public new int PageSize

{

get { return intPageSize; }

set { intPageSize = value; }

}

}

以上代码定义了一个存储翻页相关信息的参数,此参数派生于System.EventArgs,在这里系统不强制要求一定继承于该,不继承它也是可以的,但继承于该有一点好处。先看一下System.EventArgs基的代码:

?

1

2

3

4

5

6

7

8

9

10
/// <summary>

///

/// </summary>

public class EventArgs

{

//表示没有事件数据的事件

public static readonly EventArgs Empty;

//初始化 System.EventArgs 类的新实例

public EventArgs();

}

EventArgs中除了一个构造方法外,还有一个它本身型的Empty属性,从这里可以知道前面在调用时通过OnTextChanged(EventArgs.Empty);格式,把EventArgs.Empty作为空参数传入事件引发方法时的用途了。这里要说明的是如果我们的GridPageChangedEventArgs是从EventArgs继承而来,则不但可以传递GridPageChangedEventArgs对象,而且可以使用GridPageChangedEventArgs.Empty的形式传递空参数对象。

在GridPageChangedEventArgs方法体中定义了一些属性;分别表示当前页(CurrentPageIndex)、页总数(PageCount)和页尺寸(PageSize)。这些都是我们自定义的页信息数据。

代码中的这句:

?

1
public delegate void GridPageChangedEventHandler(object source, GridPage ChangedEventArgs e);

定义了一个委托GridPageChangedEventHandler。该委托可以指定这样的一个事件方法:第一个参数为object型,第二个参数即为上面我们定义的页参数对象GridPageChanged EventArgs。在注册事件时,该委托可以保证在页面后面代码中自动产生的事件体的两个参数型与自己的两个参数型一致。下面是在页面中注册的事件后台代码:

?

1

2

3

4

5

6
protected void Grid1_PageIndexChanged(object source,GridPageChangedEventArgs e)

{

int intCurrentPageIndex = e.CurrentPageIndex;

int intPageSize = e.PageSize;

//获取数据逻辑

}

可以看到第二个参数型即我们定义的GridDocPageChangedEventArgs型,在事件方法体中,可以直接通过e.CurrentPageIndex和e.PageSize获取数据,这种应用就比较多了。
现在页参数对象和委托定义好了,下面说一下在主控件内部是如何应用它们的。声明事件代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
/// <summary>

///

/// </summary>

private new static readonly object EventPageIndexChanged = new object();

[Category("Action"), Description("翻页事件")]

public event GridPageChangedEventHandler PageIndexChanged

{

add

{

base.Events.AddHandler(Grid.EventPageIndexChanged, value);

}

remove

{

base.Events.RemoveHandler(Grid.EventPageIndexChanged, value);

}

}

这里继续采用高效率事件集合列表对象base.Events,事件的名称为PageIndexChanged,委托型为之前我们定义的委托型GridPageChangedEventHandler。
引发事件的核心代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73
/// <summary>

///

/// </summary>

protected override bool OnBubbleEvent(object source, EventArgs e)

{

bool handled = false;

if (e is GridCommandEventArgs)

{

if ((((GridCommandEventArgs)(e)).CommandSource) is LinkButton)

{

LinkButton lb=((LinkButton)(((GridCommandEventArgs)(e)). Command Source));

if (lb.CommandName == "Page")

{

if (lb.CommandArgument == "ButtonFirst")

{

GridPageChangedEventArgs ee = new GridPageChangedEventArgs();

if (this.CurrentPageIndex != 0)

{

this.CurrentPageIndex = 0;

ee.CurrentPageIndex = this.CurrentPageIndex;

ee.PageCount = this.PageCount;

ee.PageSize = this.PageSize;

this.OnPageIndexChanged(ee);

}

handled = true;

}

if (lb.CommandArgument == "ButtonNext")

{

GridPageChangedEventArgs ee = new GridPageChangedEventArgs();

if (this.CurrentPageIndex < this.PageCount - 1)

{

this.CurrentPageIndex += 1;

ee.CurrentPageIndex = this.CurrentPageIndex;

ee.PageCount = this.PageCount;

ee.PageSize = this.PageSize;

this.OnPageIndexChanged(ee);

}

handled = true;

}

if (lb.CommandArgument == "ButtonPrev")

{

GridPageChangedEventArgs ee = new GridPageChangedEventArgs();

if (this.CurrentPageIndex > 0)

{

this.CurrentPageIndex -= 1;

ee.CurrentPageIndex = this.CurrentPageIndex;

ee.PageCount = this.PageCount;

ee.PageSize = this.PageSize;

this.OnPageIndexChanged(ee);

}

handled = true;

}

if (lb.CommandArgument == "ButtonLast")

{

GridPageChangedEventArgs ee = new GridPageChangedEventArgs();

if (this.CurrentPageIndex != this.PageCount - 1)

{

this.CurrentPageIndex = this.PageCount - 1;

ee.CurrentPageIndex = this.CurrentPageIndex;

ee.PageCount = this.PageCount;

ee.PageSize = this.PageSize;

this.OnPageIndexChanged(ee);

}

handled = true;

}

}

}

}

return handled || base.OnBubbleEvent(source, e);

}

以上OnBubbleEvent方法主要应用于复合控件中,采用冒泡形式处理子控件事件,后面介绍复合控件冒泡处理事件机制时再详细讲解此方法。另外,在控件的翻页栏中预先放置了四个翻页功能的按钮,分别表示“首页”、“上一页”、“下一页”、“末页”,并设置它们的属性CommandName都为“Page”,CommandArgument分别为“ButtonFirst”,“ButtonPrev”,“ButtonNext”,“ButtonLast”。
这样就可以根据按钮的命令和参数确定执行什么样的逻辑。这里仅拿按钮“下一页”(Command="Page"&&CommandArgument="ButtonNext")为例解释一下代码逻辑:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
/// <summary>

///

/// </summary>

if (lb.CommandArgument == "ButtonNext")

{

GridPageChangedEventArgs ee = new GridPageChangedEventArgs();

if (this.CurrentPageIndex < this.PageCount - 1)

{

this.CurrentPageIndex += 1;

ee.CurrentPageIndex = this.CurrentPageIndex;

ee.PageCount = this.PageCount;

ee.PageSize = this.PageSize;

this.OnPageIndexChanged(ee);

}

handled = true;

}

代码中首先定义一个页参数对象,然后通过条件语句判断当前是否是最后一页,如果不是最后一页,则从主控件上读取当前页信息(当前页、页数、页记录数),并赋值给GridPageChangedEventArgs对象,然后以页参数对象作为参数调用this.OnPageIndexChanged方法引发事件。另外,注意LinkButton的CommandName和CommandArgument属性的组合用法。
最后,看一下OnPageIndexChanged方法代码:

?

1

2

3

4

5

6

7

8

9

10
/// <summary>

/// </summary>

protected new void OnPageIndexChanged(GridPageChangedEventArgs e)

{

GridPageChangedEventHandler handler1 = (GridPageChangedEventHandler)base. Events[Grid.EventPageIndexChanged];

if (handler1 != null)

{

handler1(this, e);

}

}

此方法的功能是从base.Events对象中取出以Grid.EventPageIndexChanged为Key的事件引用句柄,假如句柄不为null(开发人员注册了翻页事件),则引发事件方法体。
最后,说明非常重要的一点:如果自定义了事件参数,并要求在开发人员注册的事件体中自动显示改变参数对象的型,如:

?

1

2

3

4
protected void Grid1_PageIndexChanged(object source, GridPageChangedEventArgs e)

{

//… …

}

其中的第二个参数显示为GridPageChangedEventArgs型,而不是默认的EventArgs型,我们也必须定义自己的委托(如本例定义了委托GridPageChangedEventHandler);而默认的委托EventHandler对应的参数型为基System.EventArgs,即如果这里将默认的委托EventHandler和GridPageChangedEventArgs一起使用的话,则生成以下的代码语句:

?

1

2

3

4
protected void Grid1_PageIndexChanged(object source, EventArgs e)

{

//… …

}

可以看出参数变为EventArgs型了。这样就不能利用我们自己定义的GridPage ChangedEventArgs中的数据了。虽然可以使用(GridPageChangedEventArgs)EventArgs的方式转换一下也可以取得GridPageChangedEventArgs对象中的数据,但据笔者了解还没有开发人员这么用,因为没有人知道还有个GridPageChangedEventArgs

本文主要讲解如何定制自己的参数委托,并以Grid的分页功能为例演示其在实际开发中的应用。

感兴趣的读者可以参考本文所述调试运行本文示例,相信会有新的收获。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 ASP.NET中实现定制自己的委托和事件参数类 https://www.kuaiidc.com/103346.html

相关文章

发表评论
暂无评论