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

ASP.NET
如何在命令行下编译一个asp.net项目
ADO 与ADO.NET
当VS.NET2003遇上VS.NET2005,WebService部署何去何从
昨日关注:逐步解说: 将Web Form网页国际化
在.NET下编写中文代码程序
防止同一个程序多次运行。 [VB.NET]
Visual C#设计多功能关机程序
什么是Web Service?
实现ListView控件的行间隔颜色的优化代码
失去信心?还是再度迷惘(二):Mono only is Mono,not .NET never
在Winform中发HTTP请求(调用WebService服务)
.NET中加密和解密的实现方法 3
notNET中加密和解密的实现方法
.NET中加密和解密的实现方法2
mshtml:javascript为HTML文件中的Select添加option
VS.NET解决方案的兼容问题
关于创建快捷方式的小结
使用 GDI+ 进行双缓冲绘图
如何用DataGrid实现根据日期判断是否显示New标志
昨日关注:C-omega vs ADO.net

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 56 ::
收藏到网摘: 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来标识隐藏的文本域。