博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net/anthem 多级联动简化
阅读量:6369 次
发布时间:2019-06-23

本文共 5347 字,大约阅读时间需要 17 分钟。

 

 

刚好手头有需要用到多级联动的功能,平常写一堆代码用于数据绑定、事件绑定,实在太烦琐了,于是想办法简化一下,也顺便练练手~_~

实现比较简单,不多说,具体代码如下:

001 using System;
002 using System.Web.UI.WebControls;
003  
004 /// <summary>
005 /// 多级联动查询
006 /// </summary>
007 public class CascadeQuery
008 {
009     ListControl lc;
010     string defaultText;
011     string defaultSelectedValue;
012     Action<string> selectChanged;
013     CascadeQuery subQuery;
014  
015     /// <summary>
016     /// 多级联动查询
017     /// </summary>
018     /// <param name="lc">控件</param>
019     /// <param name="defaultText">默认文本</param>
020     /// <param name="defaultSelectedValue">默认选中的值</param>
021     /// <param name="selectChanged">选择变更时执行的方法</param>
022     /// <param name="subQuery">子查询</param>
023     public CascadeQuery(ListControl lc, string defaultText, string defaultSelectedValue, Action<string> selectChanged, CascadeQuery subQuery)
024     {
025         this.lc = lc;
026         this.defaultText = defaultText;
027         this.defaultSelectedValue = defaultSelectedValue;
028         this.selectChanged = selectChanged;
029         this.subQuery = subQuery;
030  
031         Anthem.DropDownList ddl = lc as Anthem.DropDownList;
032         if (ddl != null)
033         {
034             ddl.AutoUpdateAfterCallBack = true;
035             if (!ddl.Page.ClientScript.IsStartupScriptRegistered("cascadeQuery"))
036             {
037                 ddl.Page.ClientScript.RegisterStartupScript(
038                     ddl.Page.GetType(), 
039                     "cascadeQuery",                    
040                     ///选择默认选项时,取消回发
041                     ///if (ddl.selectedIndex<=0) return false;
042                     ///添加客户端脚本,用于选择变更时,设置子查询的控件默认选项为 正在查询
043                     @"function onCascadeQuery(id, ddl) {
044                         var el = document.getElementById(id);
045                         el.options.length = 0;
046                         el.options.add(new Option('正在查询...', ''));
047                     }"
048                     true);
049             }
050  
051             if (subQuery != null)
052             {
053                 //只有子查询时才启用回发
054                 ddl.AutoCallBack = true;
055                 ddl.PreCallBackFunction = string.Format(@"function(ddl) {
{onCascadeQuery('{0}',ddl);}}"
, subQuery.lc.ClientID);
056             }
057         }
058         else
059         {
060             if (subQuery != null)
061             {
062                 lc.AutoPostBack = true;
063             }
064         }
065  
066         //绑定选择变更事件
067         this.lc.SelectedIndexChanged += new EventHandler(lc_SelectedIndexChanged);
068         //页面第一次加载时,为控件添加默认选项
069         if (!lc.Page.IsPostBack)
070             ResetSelect();
071     }
072  
073     void lc_SelectedIndexChanged(object sender, EventArgs e)
074     {
075         SelectChange();
076     }
077  
078     /// <summary>
079     /// 选择变更时执行
080     /// </summary>
081     void SelectChange()
082     {
083         ResetSubSelect();
084  
085         if (lc.SelectedIndex > 0)
086         {
087             if (selectChanged != null)
088             {
089                 selectChanged(lc.SelectedValue);
090                 //执行选择变更的方法,并且递归到每个子查询
091                 if (subQuery != null && subQuery.lc.Visible)
092                     subQuery.SelectChange();
093             }
094         }
095     }
096  
097     /// <summary>
098     /// 重置控件(清空所有项,并加入默认选项)
099     /// </summary>
100     void ResetSelect()
101     {
102         lc.Items.Clear();
103         InsertDefaultItem();
104         ResetSubSelect();
105     }
106  
107     /// <summary>
108     /// 递归重置子查询的控件
109     /// </summary>
110     void ResetSubSelect()
111     {
112         if (subQuery != null)
113             subQuery.ResetSelect();
114     }
115   
116     /// <summary>
117     /// 插入默认选项
118     /// </summary>
119     void InsertDefaultItem()
120     {
121         lc.Items.Insert(0, new ListItem(defaultText, string.Empty));
122     }
123  
124     /// <summary>
125     /// 设置默认选中(仅当页面第一次加载时)
126     /// </summary>
127     void SetDefaultSelected()
128     {
129         if (!lc.Page.IsPostBack)
130         {
131             SetSelectedValue(defaultSelectedValue);
132         }
133     }
134  
135     /// <summary>
136     /// 绑定数据
137     /// </summary>
138     /// <param name="dataSource">数据源</param>
139     /// <param name="textfld">文本字段</param>
140     /// <param name="valuefld">值字段</param>
141     public void BindData(object dataSource, string textfld, string valuefld)
142     {
143         lc.DataSource = dataSource;
144         lc.DataTextField = textfld;
145         lc.DataValueField = valuefld;
146         lc.DataBind();
147         InsertDefaultItem();
148         SetDefaultSelected();
149     }
150  
151     /// <summary>
152     /// 设置选中的值
153     /// </summary>
154     /// <param name="value">值</param>
155     public void SetSelectedValue(string value)
156     {
157         //lc.SelectedValue = value;
158         ListItem item = lc.Items.FindByValue(value);
159         if (item != null)
160         {
161             lc.ClearSelection();
162             item.Selected = true;
163             SelectChange();
164         }
165     }
166 }

目前支持Anthem.DropDownList以及继承自ListControl的控件,可根据实际需要进行修改。

关键演示代码如下:

aspx:

1 <anthem:DropDownList runat="server" Id="a1" />
2 <anthem:DropDownList runat="server" Id="a2" />
3 <anthem:DropDownList runat="server" Id="a3" />

aspx.cs:

01 CascadeQuery cq3;
02 CascadeQuery cq2;
03 CascadeQuery cq1;
04 protected void Page_Load(object sender, EventArgs e)
05 {
06     cq3 = new CascadeQuery(a3, "SelectThird", string.Empty, null, null);
07     cq2 = new CascadeQuery(a2, "SelectSecond", string.Empty, A2Change, cq3);
08     cq1 = new CascadeQuery(a1, "SelectFirst", "3", A1Change, cq2);
09     if (!IsPostBack)
10         BindA1();
11 }
12  
13 DataTable GenerateData(int l)
14 {
15     DataTable table = new DataTable();
16     table.Columns.Add("value");
17     table.Columns.Add("text");
18     for (int i = 0; i < 10; i++)
19     {
20         string value = (i * l).ToString();
21         table.Rows.Add(value, "text-" + value);
22     }
23     return table;
24 }
25  
26 void BindA1()
27 {
28     cq1.BindData(GenerateData(1), "text", "value");
29 }
30  
31 void A1Change(string value)
32 {
33     cq2.BindData(GenerateData(int.Parse(value)), "text", "value");
34     cq2.SetSelectedValue("6");
35 }
36  
37 void A2Change(string value)
38 {
39     cq3.BindData(GenerateData(int.Parse(value)), "text", "value");
40 }

代码下载:

打完收工,睡觉~

作者:

出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/gaoxuzhao/archive/2011/11/29/2268405.html

你可能感兴趣的文章
js Date操作
查看>>
判断用户密码是否在警告期内(学习练习)
查看>>
sp_executesql的执行计划会被重用(转载)
查看>>
禅道项目管理软件插件开发
查看>>
Linux系统各发行版镜像下载
查看>>
JS获取键盘按下的键值event.keyCode,event.charCode,event.which的兼容性
查看>>
查看ORACLE 数据库及表信息
查看>>
腾讯、百度、阿里面试经验—(1) 腾讯面经
查看>>
Codeforces Round #374 (Div. 2) D. Maxim and Array 贪心
查看>>
HTML DOM 教程Part1
查看>>
GBDT的基本原理
查看>>
MySQL修改root密码的多种方法(转)
查看>>
MongoDB 基础命令——数据库表的增删改查——遍历操作表中的记录
查看>>
.NET Core 跨平台发布(dotnet publish)
查看>>
Activity入门(一)
查看>>
CentOS下如何从vi编辑器插入模式退出到命令模式
查看>>
Mysql索引的类型
查看>>
Eclipse debug模式 总是进入processWorkerExit
查看>>
Nginx的https配置记录以及http强制跳转到https的方法梳理
查看>>
[每天五分钟,备战架构师-1]操作系统的类型和结构
查看>>