工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2185|回复: 2

让AtlasToolkit中的CacadingDropDown支持多选(Asp.net Ajax Atlas 控件)

[复制链接]
发表于 2006-8-26 10:43 | 显示全部楼层 |阅读模式
  现在在公司的一个项目中使用到AtlasToolkit中的CacadingDropDown,有一些需要有多选框(即Asp.Net服务器控件中的ListBox,HTML代码中的<select multiple="true"></select>),但是CascadingDropDown并不支持多选,全部是单选. 经过一翻研究和尝试之后,终于给它增加了多选的功能,于是就有了这篇文章.

  AtlasToolkit中的控件由几个部分组成
[lsit=A]
  
  • Bihavior:这是一个客户端Js文件,定义了控件在客户端的行为,应该是AtlasTookit控件的核心部分
      
  • Extender:这是控件的服务端支持,用于支持控件的服务端操作
      
  • Properties:这是服务端配置类
      
  • Designer:设计时支持

     在开始之前,先看看效果(注意最下一行字,这就是多选的结果),


    要改造CascadingDropDown,就要拿这几个部分分别开刀.现在一步一步来.
    第一步,让它在服务端支持ListBox

      虽然多选框跟单选下拉框在客户端都是Select,但在服务端却是两个不同的控件.CascadingDropDown本身只支持DropDownList

    public class CascadingDropDown : ExtenderControlBase<CascadingDropDownProperties, DropDownList>

      上面是Extender文件中CascadingDropDown的声明,它继承自ExtenderControlBase,注意红色部分,因为这里的声明使它仅仅支持DropDownList,现在我们要把它改成ListControl,这样就可以同时支持ListBox和DropDownList了,因为这两个都继承自ListControl.

    除了这里,Properties和Designer中的相应的泛型声明都要改成ListControl.

      以上做的是在接口上支持ListBox,现在要使它在行为上支持ListBox.这个只需要改Extender一个文件就可以了.

    1. protected override void OnLoad(EventArgs e)
    2. {
    3.  base.OnLoad(e);
    4.  foreach (CascadingDropDownProperties cascadingDropDownProperties in TargetProperties)
    5.  {
    6.   ListControl ctrl = (ListControl)FindControlHelper(cascadingDropDownProperties.TargetControlID);
    7.   if (ctrl is DropDownList)
    8.   {
    9.    DropDownList dropDownList = ctrl as DropDownList;
    10.    dropDownList.Items.Clear();
    11.    dropDownList.Items.Add(cascadingDropDownProperties.ClientState);
    12.   }
    13.   else if (ctrl is ListBox)
    14.   {
    15.    ListBox listBox = ctrl as ListBox;
    16.    listBox.Items.Clear();
    17.    if (cascadingDropDownProperties.ClientState == null)
    18.     return;
    19.    foreach (string item in cascadingDropDownProperties.ClientState.Split(','))
    20.    {
    21.     listBox.Items.Add(item);
    22.    }
    23.   }
    24.  }
    25. }

    26. protected override void OnPreRender(EventArgs e)
    27. {

    28.  foreach (CascadingDropDownProperties cascadingDropDownProperties in TargetProperties)
    29.  {
    30.   ListControl ctrl = (ListControl)FindControlHelper(cascadingDropDownProperties.TargetControlID);
    31.   if (ctrl is DropDownList)
    32.   {
    33.    DropDownList dropDownList = ctrl as DropDownList;
    34.    dropDownList.Items.Clear();
    35.   }
    36.   else if (ctrl is ListBox)
    37.   {
    38.    ListBox listBox = ctrl as ListBox;
    39.    listBox.Items.Clear();
    40.   }
    41.  }

    42.  base.OnPreRender(e);
    43. }

    复制代码

      好了,上面就是改变服务端的,使之确实地支持ListBox,到这里服务端就修改完成了.

    第二步,修改Behavior,以下的修改后的Behavior文件中的set_SelectedValue, 只需要修改这个地方就可以了.

    1. this.set_SelectedValue = function(value) {

    2. if( this.control != null && this.control.element != null && this.control.element.multiple )
    3. {
    4.   var e = this.control.element;
    5.   //是多选框,即ListBox
    6.   _selectedValue = new Array();
    7.   for( var i = 0; i < e.options.length; ++i )
    8.   {
    9.    if( e.options[i].selected )
    10.      _selectedValue[ _selectedValue.length ] = e.options[i].value;
    11.   }
    12.   AtlasControlToolkit.CascadingDropDownBehavior.callBaseMethod(this, 'set_ClientState', [ _selectedValue.toString() ]);
    13. }
    14. else
    15. {
    16.   _selectedValue = value;
    17.   AtlasControlToolkit.CascadingDropDownBehavior.callBaseMethod(this, 'set_ClientState', [ _selectedValue ]);
    18. }
    19. }

    复制代码

      好了,编译,控件的发行就完成了.接下来说使用.

      第一步:把ASPX文件中的DropDownList改成ListBox,并且加上SelectMode="Multiple"

      第二步:使用类似以下的代码来取值



    foreach (ListItem item in DropDownList3.Items)
    {
    //if (item.Selected)
    color += RemoveValueText(item.Value) + ","
    }

      注意,我把红字部分,这一行是不需要的,因为传回来的所有Item都是被选中的,没有被选中的项并没有被传回来.
  •  楼主| 发表于 2006-8-26 13:59 | 显示全部楼层
    这里学.net的本来就不多,
    知道Atlas的就更少
    这帖子没人看了....
    回复

    使用道具 举报

    发表于 2006-8-26 16:51 | 显示全部楼层
    现在还看不懂.......
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入后院

    本版积分规则

    QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

    GMT+8, 2025-5-15 10:30

    Powered by Discuz! X3.5

    Copyright © 2001-2024 Tencent Cloud.

    快速回复 返回顶部 返回列表