其实原理也很简单,分成两个部分,一个是服务器端,一个是客户端。

  首先要设置记录集,这里用DataSet来装载,二级联动,里面就要有两个DataTable;三级联动,里面就要有三个DataTable。同理,n级联动就要有n个DataTable。

  然后用第一个DataTable来绑定第一个DropDownList。第一个DropDownList是固定生成的,其他的DropDownList则是根据级数动态new出来的。

  服务器端会根据联动级数来动态创建下拉列表框。就是这样:lst = new MyDropDownList();这样呢,做一个循环,有n级就new出来n-1个。然后在设置一些属性,根据上一个DropDownList的第一个选项,作为过滤条件,绑定控件。这样第一次的显示工作就完成了。

for (i = 1; i < ds_List.Tables.Count; i++)
                {
                    dv = ds_List.Tables[i].DefaultView;

#region 绑定其他的列表框
                    //获取过滤条件
                    dv.RowFilter = "ParentID=" + ParentID;

//定义新的下拉列表框
                    lst = new MyDropDownList();
                    lst.EnableViewState = true;

lst.ID = "lst" + i;
                    lst.DataTextField = "txt";
                    lst.DataValueField = "id";

if (str_HTML.Length > 2 * i)
                        this.Controls.Add(new LiteralControl(str_HTML[2 * i]));

//添加下拉列表框
                    this.Controls.Add(lst);
                    if (str_HTML.Length > 2 * i + 1)
                        this.Controls.Add(new LiteralControl(str_HTML[2 * i + 1]));

lst.DataSource = dv;
                    lst.DataBind();

//设置父ID。第一次访问,取下拉列表框的第一个选项的值
                    if (dv.Count > 0)
                        ParentID = dv[0][1].ToString();
                    else
                        ParentID = "-9999";

#endregion
                }

  然后要输出一个js的数组,当初不会json,也不喜欢xml,所以就用数组来装载了。把这个数组输出到页面里。然后客户端的js就可以访问到需要的数据了。

  下面说一下客户端。客户端是通过js的onchange函数实现联动,原理呢就是“递归”。写两个js函数就搞定了,一个是入口函数(lst_change),另一个是结束函数(lstSelected)。

  当第一个下拉列表框触发了onchange函数(lst_change)的时候,会根据用户的选项对下一个下拉列表框的item进行设置,然后判断一下是否有下下一个下拉列表框,有的话递归调用lst_change(),没有的话调用结束函数(lstSelected)。

  这样不管有多少个下拉列表框,都可以用这两个js函数搞定。

  注意点:

  1、由于用的是服务器控件DropDownList,他有一个“特点”,那就是在客户端用js设置的item,在服务器端都是不承认的。为了解决这个问题,我用了一个奔办法,加了一个文本框,用这个文本框来保存客户的选项。然后提交表单,根据这个文本框里的内容来确定客户选择了哪些选项。

  

  原来基本就是这样。然后打算引入jQuery和json来简化一下代码,再然后看看能不能做成纯客户端的,就是不用服务器控件了,直接使用 html的input。

  

【自然框架】n级下拉列表框的原理相关推荐

  1. 【自然框架 NatureFW】里的两种“映射”方式

    自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的"CCM " (我自己想的,呵呵). 先说一下ORM.ORM是O和R的映射关系.也看到很多人写关于ORM的文章,发 ...

  2. 【自然框架】之“元数据”的威力

    定义       元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. 我的理解就是对数据进行说明.描述.不知道我 ...

  3. 【自然框架】——思路、结构、特点的介绍(初稿,欢迎大家多提意见)

    开场白 面向过程:面向过程是"写代码",根据客户提出来的需求来写代码,包括函数.一步一步的写,都写完了,功能也就实现了. 面向对象:面向对象是"做设计",先不考 ...

  4. 调用其他app 的lib_ButterKnife执行效率为什么比其他注入框架高?它的原理是什么...

    面试官: ButterKnife为什么执行效率为什么比其他注入框架高?它的原理是什么 心理分析: ButterKnife框架一直都是使用,很少又开发者对butterknife深入研究的,既然你是面试A ...

  5. 滨州学院计算机自荐考试题型,滨州学院2004—2005学年第一学期期末考试计算机科学教育专业02级《数据库原理》试题及答案(3份,另附习题集)...

    内容简介: 滨州学院2004-2005学年第一学期期末考试计算机科学教育专业02级<数据库原理>试题及答案(3份) <数据库原理>模拟试题一 一.选择题(每题1分,共5分) 1 ...

  6. 【自然框架】稳定版的Demo——看点二:权限,权限过滤与验证。

    建议先看看 上一篇:[自然框架]稳定版beta1--源码下载,Demo说明 下载地址:还是老地方,自然框架的源代码.Demo.数据库.配置信息管理程序下载(2010.01.25更新) 在线演示:htt ...

  7. 【自然框架】稳定版beta1——源码下载,Demo说明

    在线演示:http://demo.naturefw.com/ 开源协议 一直想说来着,可是总忘.开源协议采用 BSD开源协议. 一直在说开源,但只是把源码放出来了,连个开源协议都没说,虽然说了也基本等 ...

  8. 牛逼哄哄的 RPC 框架,底层到底什么原理?

    1. RPC框架的概念 RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术. 使用RPC可以解耦系统,方便维护, ...

  9. 【自然框架】——重开在线演示

    以前的那个在线演示的空间和域名过期了(感谢"云淡风清"和"恭敬"提供域名.空间和数据库),想想还是自己弄个空间来的稳定一些.所以买了个空间,交了一年的钱,所以至 ...

最新文章

  1. CentOS 7 - 最小化安装后,解决无法使用yum命令问题!!
  2. 透视表提取不反复记录(3)-每组最小值
  3. Linux 服务器安装discuz 7.2论坛
  4. python求两个列表的并集.交集.差集方法
  5. Vim试水之六:NerdTree插件安装
  6. 容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对
  7. 薪资是跳出来的,不是涨出来的!
  8. python执行oracle命令_如何使用cx\U Oracle运行非查询sql命令?
  9. c语言函数的使用步骤,c语言打开文件函数使用方法
  10. postgresql 遍历字符串数组_每日一道编程题(348):1005.K次取反后最大化的数组和...
  11. 代码风格研究:左花括号 是否换行???
  12. python解码和编码的区别_python基础小知识,is和==的区别,编码和解码
  13. 计算机一级和答案,全国计算机一级操作题及答案
  14. ios开发之iOS 11 SDK 的新特性
  15. BASH系列(2)——变量
  16. android u盘加载_如何获取Android系统挂载U盘的路径
  17. CCS简介及其下载安装卸载
  18. linux下包管理器
  19. 2k显示无法连接服务器,NBA2K18无法连接服务器怎么办 无法连接服务区解决方法一览...
  20. 高速PCB设计的一些注意事项

热门文章

  1. 卡在linuxctrld进系统_Linux系统执行df -h命令卡死的解决方案
  2. 21朵水仙花算法java_水仙花数算法 - hi_jyf - OSCHINA - 中文开源技术交流社区
  3. 什么是pdi检测_为什么国人买车钟爱白色?这几点购车陷阱不要踩
  4. SQL SERVER 2000 数据库备份和SQL Server数据库备份有两种方式,
  5. 拉丁正方形 java_Leetcode 221 最大正方形 动态规划
  6. 风变Python 15数据的读入以及写出以及数据的编码类型
  7. 运动目标跟踪(十)--CSK跟踪
  8. Android NDK开发之 opencv for android 问题总结
  9. python 语法提示_Python 语法提示vim配置
  10. Markdown(四)——绘图工具mermaid之状态图stateDiagram