下拉列表也是Web开发中常用的控件之一,用来从一组可选项中选取一项。FineUI中的下拉列表不仅可以通过ASPX标签声明,也可以绑定到各种数据源。FineUI还根据实际项目的需要,扩展了一种模拟树的下拉列表。

标签声明的下拉列表

   1:  <f:DropDownList runat="server" ID="DropDownList1">
   2:      <f:ListItem Text="选项 1" Value="Value1" Selected="true" />
   3:      <f:ListItem Text="选项 2(不可选择)" Value="Value2" EnableSelect="false" />
   4:      <f:ListItem Text="选项 3(不可选择)" Value="Value3" EnableSelect="false" />
   5:      <f:ListItem Text="选项 4" Value="Value4" />
   6:  </f:DropDownList>

绑定到字符串列表的下拉列表

   1:  <f:DropDownList runat="server" ID="DropDownList1" Resizable="True">
   2:  </f:DropDownList>
   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:      if (!IsPostBack)
   4:      {
   5:          List<string> strList = new List<string>();
   6:          strList.Add("选项 1");
   7:          strList.Add("选项 2");
   8:          strList.Add("选项 3");
   9:          strList.Add("选项 4");
  10:   
  11:          DropDownList1.DataSource = strList;
  12:          DropDownList1.DataBind();
  13:      }
  14:  }

绑定到自定义类列表的下拉列表

   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:      if (!IsPostBack)
   4:      {
   5:          List<CustomClass> myList = new List<CustomClass>();
   6:          myList.Add(new CustomClass("1", "选项 1"));
   7:          myList.Add(new CustomClass("2", "选项 2"));
   8:          myList.Add(new CustomClass("3", "选项 3"));
   9:          myList.Add(new CustomClass("4", "选项 4"));
  10:   
  11:          DropDownList1.DataTextField = "Name";
  12:          DropDownList1.DataValueField = "ID";
  13:          DropDownList1.DataSource = myList;
  14:          DropDownList1.DataBind();
  15:      }
  16:  }
  17:   
  18:   
  19:  public class CustomClass
  20:  {
  21:      private string _id;
  22:   
  23:      public string ID
  24:      {
  25:          get { return _id; }
  26:          set { _id = value; }
  27:      }
  28:      private string _name;
  29:   
  30:      public string Name
  31:      {
  32:          get { return _name; }
  33:          set { _name = value; }
  34:      }
  35:   
  36:      public CustomClass(string id, string name)
  37:      {
  38:          _id = id;
  39:          _name = name;
  40:      }
  41:  }

绑定到表格的下拉列表

   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:      if (!IsPostBack)
   4:      {
   5:          DataTable table = new DataTable();
   6:          DataColumn column1 = new DataColumn("MyText", typeof(String));
   7:          DataColumn column2 = new DataColumn("MyValue", typeof(String));
   8:          table.Columns.Add(column1);
   9:          table.Columns.Add(column2);
  10:   
  11:          DataRow row = table.NewRow();
  12:          row[0] = "选项 1";
  13:          row[1] = "1";
  14:          table.Rows.Add(row);
  15:          row = table.NewRow();
  16:   
  17:          row[0] = "选项 2";
  18:          row[1] = "2";
  19:          table.Rows.Add(row);
  20:   
  21:          row = table.NewRow();
  22:          row[0] = "选项 3";
  23:          row[1] = "3";
  24:          table.Rows.Add(row);
  25:   
  26:          row = table.NewRow();
  27:          row[0] = "选项 4";
  28:          row[1] = "4";
  29:          table.Rows.Add(row);
  30:   
  31:          DropDownList1.DataTextField = "MyText";
  32:          DropDownList1.DataValueField = "MyValue";
  33:          DropDownList1.DataSource = table;
  34:          DropDownList1.DataBind();
  35:      }
  36:  }

模拟树的下拉列表

很多时候,我们希望在下拉列表中显示简单树状的层次结构,在菜单设置、机构设置等场景下这个需求尤为突出。也是基于项目需求的考虑,FineUI增加了模拟树的下拉列表的功能,显示效果如下所示:

注意,这里不仅包含了树状的层次结构,而且包含了可选择项和不可选择项。下面就来看看如何实现这个示例:

   1:  <f:DropDownList Label="DropDownList" AutoPostBack="false" Required="true" EnableSimulateTree="true"
   2:          ShowRedStar="true" runat="server" ID="ddlBox">
   3:  </f:DropDownList>
   1:  public class JQueryFeature
   2:  {
   3:      private string _id;
   4:      public string Id
   5:      {
   6:          get { return _id; }
   7:          set { _id = value; }
   8:      }
   9:      
  10:      private string _name;
  11:      public string Name
  12:      {
  13:          get { return _name; }
  14:          set { _name = value; }
  15:      }
  16:   
  17:      private int _level;
  18:      public int Level
  19:      {
  20:          get { return _level; }
  21:          set { _level = value; }
  22:      }
  23:   
  24:      private bool _enableSelect;
  25:      public bool EnableSelect
  26:      {
  27:          get { return _enableSelect; }
  28:          set { _enableSelect = value; }
  29:      }
  30:   
  31:      public JQueryFeature(string id, string name, int level, bool enableSelect)
  32:      {
  33:          _id = id;
  34:          _name = name;
  35:          _level = level;
  36:          _enableSelect = enableSelect;
  37:      }
  38:  }
  39:   
  40:  protected void Page_Load(object sender, EventArgs e)
  41:  {
  42:      if (!IsPostBack)
  43:      {
  44:          List<JQueryFeature> myList = new List<JQueryFeature>();
  45:          myList.Add(new JQueryFeature("0", "jQuery", 0, false));
  46:          myList.Add(new JQueryFeature("1", "核心", 1, false));
  47:          myList.Add(new JQueryFeature("2", "选择符", 1, false));
  48:          myList.Add(new JQueryFeature("3", "基本选择符", 2, true));
  49:          myList.Add(new JQueryFeature("4", "内容选择符", 2, true));
  50:          myList.Add(new JQueryFeature("5", "属性选择符", 2, true));
  51:          myList.Add(new JQueryFeature("6", "筛选", 1, false));
  52:          myList.Add(new JQueryFeature("7", "过滤", 2, true));
  53:          myList.Add(new JQueryFeature("8", "查找", 2, true));
  54:          myList.Add(new JQueryFeature("9", "事件", 1, false));
  55:          myList.Add(new JQueryFeature("10", "页面载入", 2, true));
  56:          myList.Add(new JQueryFeature("11", "事件处理", 2, true));
  57:          myList.Add(new JQueryFeature("12", "事件委托", 2, true));
  58:   
  59:          ddlBox.DataTextField = "Name";
  60:          ddlBox.DataValueField = "Id";
  61:          ddlBox.DataSimulateTreeLevelField = "Level";
  62:          ddlBox.DataEnableSelectField = "EnableSelect";
  63:          ddlBox.DataSource = myList;
  64:          ddlBox.DataBind();
  65:   
  66:          ddlBox.SelectedValue = "3";
  67:      }
  68:  }

除了正常数据绑定中常见的DataTextField、DataValueField、DataSource、DataEnableSelectField属性外,还多了另外一个属性:

  1. DataSimulateTreeLevelField:模拟树显示时指示所在层次的数据字段。

开发人员只需要简单地多计算一个字段,剩下页面上的渲染工作就全部交给FineUI完成了,是不是很方便。

中国的省市县三级联动

相信很多开发人员都在ASP.NET AJAX环境下实现过类似的效果,在ASPX中需要一堆的标签支持,下面给出了一个可能的实现:

   1:  <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
   2:  </asp:ScriptManager>
   3:  <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
   4:      <ContentTemplate>
   5:          <asp:DropDownList ID="dpSheng" runat="server" 
   6:                          AutoPostBack="true" OnSelectedIndexChanged="dpProvince_SelectedIndexChanged" />
   7:          <asp:DropDownList ID="dpShi" runat="server" AutoPostBack="true" 
   8:                          OnSelectedIndexChanged="dpCity_SelectedIndexChanged" />
   9:          <asp:DropDownList ID="dpXian" runat="server" AutoPostBack="false" />
  10:          <asp:UpdateProgress ID="UpdateProgress1" runat="server">
  11:              <ProgressTemplate>
  12:                  正在加载...
  13:              </ProgressTemplate>
  14:          </asp:UpdateProgress>
  15:      </ContentTemplate>
  16:      <Triggers>
  17:          <asp:AsyncPostBackTrigger ControlID="dpSheng" EventName="SelectedIndexChanged" />
  18:          <asp:AsyncPostBackTrigger ControlID="dpShi" EventName="SelectedIndexChanged" />
  19:      </Triggers>
  20:  </asp:UpdatePanel>

下面再来看看FineUI中如何实现同样的功能,并且视觉效果会更加有冲击力:

   1:  <f:PageManager ID="PageManager1" runat="server" />
   2:  <f:SimpleForm ID="SimpleForm1" Width="350px" runat="server" BodyPadding="5px" Title="简单表单">
   3:      <Items>
   4:          <f:DropDownList ID="ddlSheng" Label="省份" runat="server"
   5:              AutoPostBack="true" OnSelectedIndexChanged="ddlSheng_SelectedIndexChanged">
   6:          </f:DropDownList>
   7:          <f:DropDownList ID="ddlShi" Label="地区市" runat="server"
   8:              AutoPostBack="true" OnSelectedIndexChanged="ddlShi_SelectedIndexChanged">
   9:          </f:DropDownList>
  10:          <f:DropDownList ID="ddlXian" Label="县区市" runat="server">
  11:          </f:DropDownList>
  12:      </Items>
  13:  </f:SimpleForm>

是不是很简单,没有任何额外的标签,只是一个表单控件里面放三个下拉列表,再来看看后台代码:

   1:  private readonly static JSONArray SHENG_JSON = new JSONArray("[\"北京\",\"天津\",\"上海\",\"重庆\"]");
   2:  private readonly static JSONObject SHI_JSON = new JSONObject("{\"北京\":[\"北京市\"],\"天津\":[\"天津市\"],\"上海\":[\"上海市\"]}");
   3:  private readonly static JSONObject XIAN_JSON = new JSONObject("{\"北京市\":[\"东城区\",\"西城区\"],\"天津市\":[\"和平区\",\"河东区\"]}");
   4:   
   5:  protected void Page_Load(object sender, EventArgs e)
   6:  {
   7:      if (!IsPostBack)
   8:      {
   9:          BindSheng();
  10:          BindShi();
  11:          BindXian();
  12:      }
  13:  }
  14:   
  15:  private void BindSheng()
  16:  {
  17:      ddlSheng.DataSource = SHENG_JSON.getArrayList();
  18:      ddlSheng.DataBind();
  19:   
  20:      ddlSheng.Items.Insert(0, new ListItem("选择省份", "-1"));
  21:  }
  22:   
  23:  private void BindShi()
  24:  {
  25:      string sheng = ddlSheng.SelectedValue;
  26:   
  27:      if (sheng != "-1")
  28:      {
  29:          JSONArray ja = SHI_JSON.getJSONArray(sheng);
  30:          ddlShi.DataSource = ja.getArrayList();
  31:          ddlShi.DataBind();
  32:      }
  33:   
  34:      ddlShi.Items.Insert(0, new ListItem("选择地区市", "-1"));
  35:  }
  36:   
  37:  private void BindXian()
  38:  {
  39:      string shi = ddlShi.SelectedValue;
  40:   
  41:      if (shi != "-1")
  42:      {
  43:          JSONArray ja = XIAN_JSON.getJSONArray(shi);
  44:          ddlXian.DataSource = ja.getArrayList();
  45:          ddlXian.DataBind();
  46:      }
  47:   
  48:      ddlXian.Items.Insert(0, new ListItem("选择县级市", "-1"));
  49:  }
  50:   
  51:  protected void ddlSheng_SelectedIndexChanged(object sender, EventArgs e)
  52:  {
  53:      ddlShi.Items.Clear();
  54:      BindShi();
  55:   
  56:      ddlXian.Items.Clear();
  57:      BindXian();
  58:  }
  59:   
  60:  protected void ddlShi_SelectedIndexChanged(object sender, EventArgs e)
  61:  {
  62:      ddlXian.Items.Clear();
  63:      BindXian();
  64:  }

来看看显示效果:

小结

每个Web开发人员都应该掌握下拉列表控件的用法,特别是从数据库读取数据并绑定到下拉列表。FineUI还别出心裁地提供了模拟树的下拉列表,服务于实际的项目需要。FineUI原生的AJAX支持也使得下拉列表之间的联动变得非常简单。

下一篇文章我们会探讨一下表单控件的客户端验证,FineUI提供了丰富完善的验证规则,包括从必填项、最大值、最小值到控件的比较,正则表达式验证等丰富的选项。

FineUI秘密花园(八) — 下拉列表控件相关推荐

  1. android如何创建spinner组件,Andriod开发之下拉列表控件(Spinner)的用法

    Spinner是Android的下拉列表控件,今天对这个控件进行了学习,发现该控件比其它简单控件使用起来稍微复杂,特地将Spinner控件的使用方法以及注意事项记录下来,以备后用. Spinner控件 ...

  2. firefox扩展开发(八) :控件激活

    firefox扩展开发(八) :控件激活 2008-06-11 17:01 当我们用鼠标点击一个控件,或者用TAB键移动到一个控件上时,我们说这个控件被激活 了(focus),离开这个控件时,我们说这 ...

  3. 第二章 第九小节Duilib中的CComboUI控件-下拉列表控件

    文章目录 1.CComboUI控件 2.作者答疑 1.CComboUI控件   在界面开发中,非常常用的一种界面控件是下拉列表控件,xml创建方式如下所示: //使用范例 <Combo name ...

  4. wpf 点击某控件范围之外的区域 该控件隐藏_iOS平台设计规范(八)控件Controls...

    无论是UI.交互,还是产品经理,都应该熟读iOS平台设计规范.这对我们的产品设计,百利而无一弊.    控件(Controls) 一.按钮(Buttons) 按钮常用于触发特定操作,可自定义的背景颜色 ...

  5. FineUI利用JS取控件的值

    用ExtJS的获取方式应该就可以了把... 我是直接用 Ext.getCmp("txt_cusname").getValue; 不过txt_cusname这个控件如果是runat= ...

  6. 八 常用控件 QLabel

    文章目录 前言 一.QLabel 二 .例子 前言 Qt中有很多功能强大控件,本文将介绍部分控件的使用 一.QLabel 显示文字 显示图片和链接 构造函数 Qt的多数控件,就是使用构造函数来初始化的 ...

  7. Linq中datetime的处理以及asp.net下拉列表控件的selectitem,text等的设置显示处理

    dhl:报错:LINQ to Entities 不支持指定的类型成员"Date" Linq如: var v = from l in _dal.Share where l.Pingc ...

  8. FineUI秘密花园(七) — 上传控件

    FineUI直到V3.0才内置了自己的上传控件,为什么唯独上传控件姗姗来迟,这其中的缘由是啥?之前又是如何实现上传功能的呢?下面听我慢慢道来. AJAX请求与文件上传请求的对比 普通的AJAX请求的请 ...

  9. LabVIEW下拉列表和枚举控件

    LabVIEW下拉列表和枚举控件 位于下拉列表和枚举及经典下拉列表和枚举选板上的下拉列表和枚举控件可用来创建可循环浏览的字符串列表. 下拉列表控件 下拉列表控件是将数值与字符串或图片建立关联的数值对象 ...

最新文章

  1. One Day-XML:XSLT
  2. Laravel的console使用方法
  3. C# 离线人脸识别 ArcSoft
  4. 读zepto核心源码学习JS笔记(3)--zepto.init()
  5. 前端学习(2930):内嵌改变样式
  6. oracle安装 衍生进程已退出,linux安装oracle 出现问题
  7. c语言实现1024点fft程序,C语言1024点快速傅里叶变换(FFT)程序,最好经过优化,执行速度快...
  8. 做游戏,学编程(C语言) 13 消灭星星
  9. 【益智题】十块钱去哪了?
  10. 《Java核心技术 卷II》笔记——(12)安全加密
  11. Vulkan入门(9)-渲染和显示.md
  12. iphone怎么录屏 苹果屏幕录制怎么操作
  13. HMTL5高拍仪开发包(支持谷歌 百度 火狐 360 QQ IE10以上等浏览器)
  14. 人民币与美元汇率兑换程序
  15. mysql innodb_data_read_Innodb_data_read 与Innodb_data_reads的区别
  16. 2019 计蒜之道 初赛 第一场 商汤的AI伴游小精灵
  17. 玩客云能搭建文档编辑服务器吗,轻NAS玩客云持续写盘解决办法,亲测暂时好用(弃用,只能维持一天不读写)...
  18. SVN拉取、提交文件
  19. 你还在被触摸事件困扰吗?看看这篇吧
  20. 资深前端老司机到底牛逼在哪?

热门文章

  1. Android 序列化(Serializable和Parcelable)
  2. if(x=1)和if(x==1)这两条语句的差别
  3. 剑荡八荒手游怎么在电脑玩?剑荡八荒PC电脑版使用教程
  4. 便利生活 未来十大或可成型技术应用
  5. 使用远程桌面鼠标移动缓慢问题的解决方法
  6. Spark Operator 部署及入门示例
  7. 华为手机年轻化转型初见成效,《梦想的声音》传递了哪些讯号?
  8. 常用易忘CSS小技巧
  9. beamManagement(三)connected mode DL Beam training
  10. 什么是流形(manifold)、流形学习