Multi-ListBox ASP.NET控件

时间:2010-02-25 17:23:50  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:我认为最重要的实际上就是页面的生命周期的理解,如果您基础上理解了它的话,那么,基础上,你以后开发一款ASP.NET控件也不是一件很难的事情。我们还是简单了解开发的思路吧。下面是类的设计图(跟本文无关的方法和属性已被我隐藏)   
  正文:开发一个优秀的数据绑定不是一件很容易的事情。刚开始的时候走了一些弯路,一直紧紧咬着 DataBoundControl类不放。最终失望之后冷静下来想到关于DataSource不就是一个数据集合吗?明白之后,有关数据源的问题基础上也解决了。在整个Multi-ListBox控件开发中,我认为最重要的实际上就是页面的生命周期的理解,如果您基础上理解了它的话,那么,基础上,你以后开发一款ASP/ target=_blank class=infotextkey>asp.NET控件也不是一件很难的事情。我们还是简单了解开发的思路吧。下面是类的设计图(跟本文无关的方法和属性已被我隐藏)
  ]
  在控件的生命周期中,我们主要需要解决用户回发页面的时候保留ListBox的数据源(因为我没有采用复合控件的方式来开发)。因些,我们需要重写控件的SaveViewState, LoadViewState二个方法。
  
  
  ViewStates
   1 protected override void LoadViewState(object savedState)
   2 {
   3 if (savedState != null)
   4 {
   5 Triplet triplet = (Triplet)savedState;
   6 base.LoadViewState(triplet.First);
   7 Reflector.InvokeMethod(this.FirstListBox.Items, "LoadViewState", new object[] { triplet.Second });
   8 Reflector.InvokeMethod(this.SecondListBox.Items, "LoadViewState", new object[] { triplet.Third });
   9 }
  10 else
  11 {
  12 base.LoadViewState(null);
  13 }
  14 this._stateLoaded = true;
  15 }
  16
  17 protected override object SaveViewState()
  18 {
  19 if (EnableViewState == false)
  20 return null;
  21 //启用控件视图状态
  22 object x = base.SaveViewState();
  23 object y = Reflector.InvokeMethod(FirstListBox.Items, "SaveViewState", null);
  24 object z = Reflector.InvokeMethod(SecondListBox.Items, "SaveViewState", null);
  25 if ((x == null) && (y == null) && (z == null))
  26 {
  27 return null;
  28 }
  29 return new Triplet(x, y, z);
  30 }
  31 为了省事,我没有自定义ListItem类,改为直接使用ListItemCollection来存储数据。因为MS没有提供ListItemCollection. SaveViewState和LoadViewState,我们必须采用反射的方式来调用这二个方法来保存数据。很让人郁闷。每当到紧要关头,就会发现MS写的类,方法不是internal,就是sealed。无可奈何~当然,你也可以自己写一个类来代替ListItem类.
  我们在页面上进行ListBox进行左移,右移的数据全部需要按一定的格式临时存储在HiddenField控件中,这样我们可以通过继承IPostBackDataHandler 接口中的LoadPostData方法获取我们临时存储的数据,对ListBox的数据源进行添加,移除等操作。
  IPostBackDataHandler
   1 public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
   2 {
   3 bool resultValueFlag = false;
   4 //移除指定ListItem,并需要添加了Left ListBox列表框中
   5 string itemsRemoved = postCollection[this.ClientID + "_REMOVED"];
   6 string[] itemsRemovedCol = itemsRemoved.Split(',');
   7 if (itemsRemovedCol != null)
   8 {
   9 if (itemsRemovedCol.Length > 0 && itemsRemovedCol[0] != "")
  10 {
  11 for (int i = 0; i < itemsRemovedCol.Length; i++)
  12 {
  13 string[] itemsRemoveItems = itemsRemovedCol[i].Split('|');
  14 ListItem item = this.SecondListBox.Items.FindByValue(itemsRemoveItems[1]);
  15 if (item != null)
  16 {
  17 this.SecondListBox.Items.Remove(item); "Multi-ListBox ASP.NET控件"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12905.html


关键字:

关于《Multi-ListBox ASP.NET控件》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td