C#+ASP.NET 2.0定制复合组件之高级篇
; " + BuildItemList);
现在,让我们来分析一下你发送到BuildItemList函数的两个参数。第一个参 数相应于生成的控件(<select>标签)的ID。第二个参数是另外一个ID,与前一 个命名一致,但是前面有一个"__"。这是一个你仍然需要添加到你的Web控件的 隐藏的文本框,它将作为一个“串行化”项列表的占位符。我要在OnPreRender 事件中注册这个隐藏的文本域。
注意,我已经使用我们的控件的ID来标识隐藏的文本域。 到目前为止,你已经拥有了一个完整功能的Web控件;其中,客户端 JavaScript被绑定到其中的两个按钮上。该JavaScript成功地实现在ListBox中 的项的重排序并且把其内容串行化为一个字符串;然后,该字符串被存储在一个 隐藏的文本域中。所有这些都发生在客户端。如果一个回寄发生,不会发生重排 序,因为当重排序时控件的Item服务器属性还没有收到你对它作的任何改变的消 息;但是幸运的是,位于隐藏的文本域中的表单的一个串行化快照中发生了这一 变化。现在,你有了可以与Item属性一起使用的内容了。那么,接下来,你该如 何实现呢? 二、同步 为了在第一次回寄和所有随后的回寄中实现同步,ASP.NET在 IPostBackDataHandler接口的实现中提供了一个LoadPostData方法。在每一次回 寄时都要调用这个LoadPostData方法;因此,你需要在此做一些工作。 值得一提的是,ASP.NET 2.0修整了一个在1.1版本中被忽视的小地方,然而 这一修改能够使你的工作容易许多。ASP.NET ListBox控件已经在两个版本(1.1 和2.0)中实现了IPostBackDataHandler接口。但是在2.0版本中,微软使这个接 口的方法定义虚拟化(virtual,在VB中称作Overridable)。这意味着,你不必 在EnhancedListBox控件中重新实现这个接口;而是,你仅需重载LoadPostData 方法。 更重要的是,这也意味着,你可以存取基类实现而不必创建所有已经存在于 你的扩展控件中的功能。什么功能呢?这包括微软加于其中的一切:用于处理 Item集合,SelectedIndex,SelectedValue和SelectedItem属性,及其它许多执 行ListBox控件功能的代码。在ASP.NET 1.1中,你必须在你的派生控件中实现这 个接口并且要提供你自己对这两个方法的定义代码,不仅包括你自己的加入的代 码而且还要重复微软已经在其控制中所实现的一切。 我猜测,微软有人已经发现了他们的实现中的错误,并且把方法变为virtual 的,这样开发者能够存取基类的代码。因此,在源码列表6中向你展示如何实现 重载的LoadPostData方法。在这个重载中,你将首先调用基类实现代码;然后, 加上你需要的代码以与Item集合同步。 另外,你还可以利用ListBox控件—通过把它编写成一个复合控件。此时,你 需要把ListBox中的每一个属性映射到你的EnhancedListBox以便使它成为 ListBox控件的一个投放位置点位符。无论使用哪一种方法,或者通过 LoadPostData方法的重新创建,你都仍然需要写很多代码。如果我专门为 ASP.NET1.1编写这个控件,那么我很可能采取最直接的方案:复合控件方案。 LoadPostData方法使你能够存取寄送到服务器的每一个域,包括你的隐藏文 本域(存储在要传递到这个方法的postCollection参数中)。你可以问:为什么 需要该隐藏文本域,而不是使用这个参数来存取被回寄的<select>元素呢?现 在,我作一下解释。首先,回顾一下典型的ASP时代,当时你使用Request.Form 属性来存取页面域。在回寄时,你能够存取一个<select>元素的唯一的部分是 选择的项。在该方案中,你需要完整的列 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |