winform实现下拉控件的无限级联动(DevExpress版)

1程序用到了第三方的DevExpress控件

2属性

Code
        private List<TradeTypeEntity> trades = null;//存储数据
        private List<LookUpEdit> ctl_dic = new List<LookUpEdit>();//存储控件
        private TradeTypeEntity empty_model = new TradeTypeEntity() { PT_TradeID = null, PT_TradeName = "请选择" };//空数据的示例

3构造函数

Code
        /// <summary>
        /// 加载行业类型(仅父类)
        /// </summary>
        public void InitTrade()
        {
            trades = CacheStrategy.Instance.GetObject(CacheKey.Trades) as List<TradeTypeEntity>;
            var data = (from v in trades where v.PT_ParentID.Equals("0") select v).ToList();
            LookUpEdit ctl = PrepareCtl(data);
            ctl.EditValue = null;
            ctl.EditValueChanged += new EventHandler(ctl_EditValueChanged);
            ctl_dic.Insert(0, ctl);
            ShowCtls();
        }
        /// <summary>
        /// 加载行业类型
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void InitTrade(string trade_code)
        {
            trades = CacheStrategy.Instance.GetObject(CacheKey.Trades) as List<TradeTypeEntity>;
            var target = trades.Single(v => { return v.PT_TradeCode.Equals(trade_code); });
            CreateCtls(target);
            ShowCtls();
        }

4创建控件

Code
        /// <summary>
        /// 创建控件,用到了递归
        /// </summary>
        /// <param name="trade_code"></param>
        private void CreateCtls(TradeTypeEntity target)
        {
            var data = (from v in trades where v.PT_ParentID.Equals(target.PT_ParentID) select v).ToList();
            LookUpEdit ctl = PrepareCtl(data);
            ctl.EditValue = target.PT_TradeID;
            ctl.EditValueChanged += new EventHandler(ctl_EditValueChanged);
            ctl_dic.Insert(0, ctl);
            if (target.PT_ParentID.Equals("0"))
            {
                return;
            }
            var target_temp = trades.Single(v => { return v.PT_TradeID.Equals(target.PT_ParentID); });
            CreateCtls(target_temp);
        }

 

5准备控件

Code
        /// <summary>
        /// 准备控件
        /// </summary>
        /// <param name="ctl"></param>
        /// <param name="data"></param>
        private LookUpEdit PrepareCtl(List<TradeTypeEntity> data)
        {
            data.Insert(0, empty_model);
            LookUpEdit ctl = new LookUpEdit();
            ctl.Properties.PopupWidth = 50;
            ctl.Properties.DataSource = data;
            ctl.Properties.ShowFooter = false;
            ctl.Properties.ShowHeader = false;
            ctl.Properties.PopupFormMinSize = new System.Drawing.Size(50, 0);
            ctl.Properties.DisplayMember = "PT_TradeName";
            ctl.Properties.ValueMember = "PT_TradeID";
            ctl.Properties.Columns.Add(new LookUpColumnInfo("PT_TradeName"));
            ctl.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.True;
            ctl.Properties.NullText = "请选择";
            return ctl;
        }

 

6控件选择项变更的事件

Code
        /// <summary>
        /// 选择项变更事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ctl_EditValueChanged(object sender, EventArgs e)
        {
            LookUpEdit sourceCtl = (LookUpEdit)sender;
            int index = ctl_dic.IndexOf(sourceCtl);
            ctl_dic.RemoveRange(index + 1, ctl_dic.Count - index - 1);
            if (sourceCtl.EditValue == null)
            {
                ShowCtls();
                return;
            }
            var data = (from v in trades where v.PT_ParentID.Equals(sourceCtl.EditValue) select v).ToList();
            if (data.Count > 0)
            {
                LookUpEdit ctl = PrepareCtl(data);
                ctl.EditValue = null;
                ctl.EditValueChanged += new EventHandler(ctl_EditValueChanged);
                ctl_dic.Add(ctl);
            }
            ShowCtls();
        }

7显示控件

Code
        /// <summary>
        /// 显示控件
        /// </summary>
        private void ShowCtls()
        {
            ctlTable.Controls.Clear();
            for (int i = 0; i < ctl_dic.Count; i++)
            {
                ctlTable.Controls.Add(ctl_dic[i], i, 0);
            }
        }

8获取选中的值和文本

Code
        /// <summary>
        /// 获取选中的值
        /// </summary>
        /// <returns></returns>
        public string GetSelectedID()
        {
            if (ctl_dic.First().EditValue == null)
            {
                return string.Empty;
            }
            else if (ctl_dic.Last().EditValue == null)
            {
                return ctl_dic[ctl_dic.Count - 2].EditValue as string;
            }
            return ctl_dic.Last().EditValue as string;
        }
        /// <summary>
        /// 获取选中的文本
        /// </summary>
        /// <returns></returns>
        public string GetSelectedText()
        {
            if (ctl_dic.First().Text.Equals("请选择"))
            {
                return string.Empty;
            }
            else if (ctl_dic.Last().Text.Equals("请选择"))
            {
                return ctl_dic[ctl_dic.Count - 2].Text;
            }
            return ctl_dic.Last().Text;
        }

至此完成

有机会在VS2008里不用任何第三方皮肤和控件再做一遍分享给网友吧

时间: 2024-11-03 23:53:44

winform实现下拉控件的无限级联动(DevExpress版)的相关文章

winform下拉控件缓存

问题描述 一个winform的下拉控件(例如combox)的绑定数据源可能有十万级别的数据,怎么来做缓存好点?如果在这控件中输入数据然后再去数据库进行模糊匹配的话,可能速度不够快. 解决方案 解决方案二:你想要完成的是什么功能,常规做法是不会绑十万数组在下拉框里的,你让别人怎么选解决方案三:做成autocomplete的功能,到数据库去匹配.缓存就是类似分页读取的效果,解决不了什么问题,不可能让用户去一页一页读取10w条数据解决方案四:用DATAGRID绑定数据吧,然后做个分页,10W的数据要读

如何在工具栏上添加平面下拉控件

效果图如下: 使用过WordXP的人都知道,她的界面可谓是耳目一新.尤其是她的菜单和工具条可真是酷.网上也有很多很多的人都在模仿着她,包括很多的软件公司的产品.她的出现,使得软件界刮起了一陈XP界面时尚风.废话就不再多话了,言归正题,下面我就将实现的步骤一步步地告诉给你. 第一步:新建一个单文档项目 第二步:到资源编辑器中,新增一个工具项.里面没内容的,资源就命名为ID_TOOL_ZOOM吧.呵呵,新增一个工具项与我的下拉控件有什么关系呀?当然有关系,因为一会那个下拉控件就是在这个位置上显示出来

工具条组合combo控件,下拉控件中的显示字体可以自定义么?

问题描述 工具条组合combo控件,下拉控件中的显示字体可以自定义么? 工具条组合combo控件,下拉控件中的显示字体可以自定义么?怎么让字体设置为所显示的文字的字体呢? 解决方案 有一个叫做fontcombo的第三方控件直接就支持了.

Win 10开发输入搜索自动提示下拉控件(AutoSuggestBox)实例

AutoSuggestBox控件与TextBox控件相似,但,AutoSuggestBox控件可以提供一个下拉列表,用户可以从弹出的下拉列表中选择一个项,并把被选项的内容显示在输入框上.就类似于搜索引擎的输入页面. 在使用AutoSuggestBox控件时,要注意它有几个重要事件. a.当下拉列表中的项被选择后,会发生SuggestionChosen事件. b.当在QuerySubmitted的下拉列表中做出选择后,或者单击输入框右边的查找图标(如果有,需自行设置)会提交输入的文本,这时候会发生

构建支持 Ajax 的自动完成和级联式下拉控件

本文介绍如何构建可在业务线应用程序中使用的 Asynchronous JavaScript + XML (Ajax) 控件.这些基于 JSP TagLib 的可配置控件利用 JavaScript Serialized Object Notation (JSON).JavaScript 和 CSS.它们是标准的 JSP Taglib 控件,本文将展示可多么轻松地将其拖放到任意应用程序之中,从而提供更加直观.更具响应性的用户界面. Ajax 和 JSON 是支持新一代 Web 站点的两种关键技术.业

asp.net+jquery滚动滚动条加载数据的下拉控件_jquery

这样的需求貌似自己感觉不是很合理,因为数据多了如此下拉无论从人还是机器操作都比较痛苦. 没办法由于需求下来了,只能按需求操作.网上找了很多相关控件都感觉有点庞大,占资源比较多.没办法自己花半天时间弄出个半成品自定义控件,拿出来分享下,如有高手看了请多指点. 需求:AJAX滚动滚动条加载数据的下拉列表 控件名称:Webcombo 所用技术:ASP.NET(C#),jQuery,ASP.NET一般处理文件(.ashx) 下拉列表具体实现:用DIV模拟下拉列表,input和图片模拟下拉框.最终结果如下

js实现无需数据库的县级以上联动行政区域下拉控件_javascript技巧

代码共享url: http://code.google.com/p/region-select-js/ 数据已经更新到中国统计局网站中的2012年的那批数据(制作后未核对); 下拉使用div模拟实现.可以定制样式 支持ie6/ch/ff/op 按照设计,应该可以支持无限级数据树;但是数据并非随需加载,而是全部加载.如果数据达到街道级别,或是包含国外行政区域,会比较大

Html5下拉控件同时支持文本输入和下拉代码

有时候,下拉框不能满足我们的业务需求,还需要同时支持用户输入内容,默认的select标签是不支持用户输入的,下面我说一下原生的select如何支持用户输入,代码如下: <!DOCTYPE html> <html> <head> <title></title> </head> <body> <div style="position:relative;"> <span style=&quo

jqueryui-新手请教大神一个关于JQueryEasyUI下Combogrid控件的一个问题

问题描述 新手请教大神一个关于JQueryEasyUI下Combogrid控件的一个问题 请教如何才能如图所示显示下拉框里的数据?我引用了例子里同样的方法,可是为什么显示不出来啊? 解决方案 看看你的数据格式对不对,是不是少引了什么js,页面F12看控制台有没有错误信息 解决方案二: 不明白你要搞什么,combogrid的grid不是已经显示出来了,你是要干嘛..下拉框没有显示你选择的grid数据行信息? 解决方案三: 是不是少引了什么js,页面F12看控制台有没有错误信息