当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > C#+ASP.NET 2.0 定制复合组件之高级篇

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

C#+ASP.NET 2.0 定制复合组件之高级篇


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 45 ::
收藏到网摘: n/a

     一、 增加EnhancedListBox的客户端功能
  
    为了使用客户端代码实现EnhancedListBox中项的重排序,你必须使用JavaScript脚本,并且要把它们依附到EnhancedListBox的两个按钮上。为此,我建议你使用“往后考虑”的方法。就象编写一个老式的ASP以前的Web页面,首先编写一些生成HTML文件的JavaScript。为此,最好的方法是运行该控件,然后观察其源码并把它的HTML代码复制到一个编辑器,再添加JavaScript。列表2(见下载源代码)展示了你需要添加到你的控件中的JavaScript的原始形式。然后,借助于StringBuilder/StringWriter技术(参考源码列表3),该控件构建这部分代码。该JavaScript代码由两部分功能组成:接收一个HTML控件(在本例中是一个<select>控件);使用选择索引并且在列表中上下移动它(基本上与我在本文开始我使用服务器代码向你展示的一样)。现在,你要理解,你把该JavaScript代码添加到Web控件的何处。为了实现在一个Web表单上有多个EnhancedListBox控件的情况下,该JavaScript代码不会被重复复制,你需要使用Page.ClientScript对象的ReGISterClientScriptBlock方法输出它。
  
    要使这个方法起作用,你必须在重载的OnInit事件中调用它(见源码中列表4)。
  
    最后,为使按钮正确工作,你需要把添加的客户端方法依附到其上。在列表1中的代码中,你会看到引用了一个方法RenderButtons。尽管我没有把该代码在此列出(请参考本文相应源码),但是它能够使用我在以前文章中介绍的技术生成按钮。当时,在生成实际HTML标签的之前,标签属性是使用AddAttribute方法以栈式存放的。在此,你使用一样的技术把客户端方法依附到你的按钮。
  
  string s_MoveUp = "MoveItemUp(document.all." +this.ClientID + ");
  output.AddAttribute(HtmlTextWriterAttribute.OnClick,s_MoveUp);
  
    记住,MoveItemUp是你已经编写成功的JavaScript函数之一。在生成用于排序的按钮之前,该代码将以堆栈存放这些JavaScript命令。对于向下(down)按钮,你使用一样的技术。注意,我使用ClientId代表该生成后的控件的ID;但是,在这个控件位于一个复合控件内部时,这个属性要考虑使用父控件的名字。
  
    现在,你可以成功地把该控件应用于一个Web表单中。你可以使用与你操作一个标准ListBox控件一样的方式在其上添加一些项。
  
    事实上,这完全是一个投放位置占位符(或ASP.NET ListBox控件)。当你使用重排序按钮时,你将看到列表中的项相应地改变顺序。现在让我们先记下这个问题。如果你把一个按钮拖动到一个Web表单上(不需要为之添加代码)并执行一个回寄,你猜会发生什么呢?完全与我以前描述的一样;任何你使用重排序按钮作的重排序改变都将恢复到在最近一次回寄之前该控件看上去的状态。因此,让我们修改一下这个问题。
  
    首先,我再添加一些JavaScript(源码列表5)。注意,这部分代码被添加到重载的OnInit方法中并且使用StringBuilder/StringWriter技术进行构建;而且,这个JavaScript方法的名字是BuildItemList。这个函数负责构建列表框完整内容的一个字符串描述并且把该串放到要传递到该函数的一个HTML元素的value属性中。你可以把这看作是列表内容的一种串行化。该串行化的输出风格会根据你自己的设计的不同而有所不同。调用这个JavaScript函数需要依附到该按钮上的其它代码。
  
  string s_MoveUp = "MoveItemUp(document.all." + this.ClientID + "); ";
  string s_BuildItemList ="BuildItemList(document.all." + this.ClientID +
  ",document.all.__" + this.ClientID + "); ";
  output.AddAttribute(HtmlTextWriterAttribute.Onclick,MoveUp + " " + BuildItemList);
  
    现在,让我们来分析一下你发送到BuildItemList函数的两个参数。第一个参数相应于生成的控件(<select>标签)的ID。第二个参数是另外一个ID,与前一个命名一致,但是前面有一个"__"。这是一个你仍然需要添加到你的Web控件的隐藏的文本框,它将作为一个“串行化”项列表的占位符。我要在OnPreRender事件中注册这个隐藏的文本域。
  
  protected override void OnPreRender(EventArgs e)
  {
    base.OnPreRender(e);
   if(Page != null)
   {
    Page.ClientScript.RegisterHiddenField("__" + this.ID, "");
   }
  }
  
    注意,我已经使用我们的控件的ID来标识隐藏的文本域。