现在,创建一个继承自ListBox控件的新类,如下所示:
using System.Web.UI; using System.Web.UI.WebControls; public class EnhancedListBox : ListBox {} |
如果你编译这部分代码并且把该控件添加到你的工具箱中,那么你将有一个完整功能的ASP.NET ListBox控件副本。我把这个控件作为一个继承控件开发,是因为我想使它具有一个ASP.NET ListBox控件的“占位符”的作用。以后,我再添加其它的属性以实现头部的可见性并支持重排序按钮的打开或关闭。当这些属性全部关闭时,这些控件将在外观与行为上与一个常规ListBox控件一样。然而,你不能使用一个重载的CreateChildControls把控件添加到其上,因为这个函数是用来构建一个控件层次树的。这个ASP.NET ListBox控件被编写为一个生成控件而且直接把它的所有HTML内容绘制到生成引擎;这样以来,你需要在此处“注入”你的内容。你将使用生成控件方法来构建一个标签和两个按钮,并且通过重载Render方法来生成它们。然而,一旦你重载这个方法,你就完全取消了所有的在原始ListBox中的生成内容,而这是不可取的。因此,我想借助于一些小技巧来实现。
六、 代码注入
我的方案是,以一个标准生成控件方式来绘制这个控件,其中包括table标签以及该标签与我添加的按钮的生成方式等。当我编写生成显示部分时,也就是在我想注入继承的原始的ListBox的地方,我调用了base.Render方法。这将把微软为ListBox控件编写的所有代码注入到我试图绘制的HTML部分(见源码中的列表1)。下列表格1中列出的属性决定了这部分代码的外观与行为。在本文中,我没有列出相应的属性代码,但是你可以在下载源代码中找到。注意,在代码中,你要生成的按钮将导致一个回寄(基于属性ReorderButtonPostback的值);而对接口IPostBackEventHandler的实现将捕获这个回寄。
表格1:EnhancedListBox属性
| 属性名 |
类别 |
| UpButtonCaption |
Appearance |
| DownButtonCaption |
Appearance |
| ShowReorderButtons |
Appearance |
| ShowHeading |
Appearance |
| HeadingCaption |
Appearance |
| ReorderButtonPostBack |
Behavior |
| SideButtonWidth |
Layout |
| SideButtonHeight |
Layout |
| SideButtonVerticalAlign |
Layout |
| ReorderButtonSide |
Layout |
| UpButtonStyle |
Styles |
| DownButtonStyle |
Styles |
| ListBoxStyle |
Styles |
| HeadingStyles |
Styles |
现在,既然该控件已经看上去如你希望的样式(见图1),那么你可以让该按钮多负责一些工作而不是仅引发一个回寄。最终的产品中包含事件处理代码;这部分代码位于接口IPostBackEventHandler的实现中,这样以来事件能够被有选择地向服务器激发,而另一方面开发者也可以在此处加入更多的代码。但是记住,你要使用这些按钮来重排序ListBox中的项,并且希望在不执行回寄的情况下实现这一功能。现在,我们开始分析最有趣的部分。
 图1.EnhancedListBox控件让用户重排序一个列表中的项。 |
上一页 [1] [2] [3]
关注此文的读者还看过: