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

简介: 1程序用到了第三方的DevExpress控件 2属性 Code        private List trades = null;//存储数据        private List ctl_dic = new List();//存储控件        private TradeTypeEn...

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

2属性

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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构造函数

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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创建控件

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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准备控件

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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(500);
            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控件选择项变更的事件

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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显示控件

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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获取选中的值和文本

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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里不用任何第三方皮肤和控件再做一遍分享给网友吧

目录
相关文章
|
API C# Windows
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Winform中实现无边框窗体只需要设置FormBorderStyle = FormBorderStyle.None,但是无边框下我们需要保留移动窗体、拖拽调整大小、自定义美观好看的标题栏等...
3604 0
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
|
4月前
|
开发框架 前端开发 搜索推荐
在WInform开发中实现工具栏/菜单的动态呈现
在WInform开发中实现工具栏/菜单的动态呈现
|
算法 API C#
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
最终优化实现ButtonPro按钮(继承自Button),既提供Button原生功能,又提供扩展功能,除了圆角以外,还实现了圆形、圆角矩形的脚尖效果、边框大小和颜色、背景渐变颜色...
2062 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
|
C# 图形学 Windows
Winform控件优化之圆角按钮【各种实现中的推荐做法】(上)
Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化...尝试介绍很常见的圆角效果,通过重写控件的OnPaint方法实现绘制,并在后面进一步探索对应的优化和可能的问题
1456 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(上)
|
JavaScript 前端开发 C#
C#(二十七)之C#窗体应用
学习C#窗体的基本用法。
310 0
C#(二十七)之C#窗体应用
MFC Ribbon开发中编辑框、下拉框始终为灰色的问题解决
MFC Ribbon开发中编辑框、下拉框始终为灰色的问题解决
318 0
|
SQL JavaScript 前端开发
【自然框架】之鼠标点功能现(二):表单控件的“应用”—— 代码?只写需要的!
  【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】           看了大家的回复,好像不少人误会了,我为了突出“鼠标点,功能现”,所以没有说代码,没有贴代码,这就让一些人认为我想要完全抛弃VS,自己写一个“平台”来代替,不好意思,您高估我了,我可达不到。
867 0
|
Web App开发 SQL JavaScript
【自然框架】分享 n级联动下拉列表框
  特点:1、 使用js方法,把需要的数据一次性写入到页面里,然后用js来实现联动的效果。2、 支持n级。3、 封装成了服务器控件,所以使用非常简单。4、 支持在回发的时候保持状态。5、 支持修改记录的时候设置默认选项。
1262 0
|
Web App开发
艾伟:WinForm控件开发总结(四)-----控件属性的串行化
前一篇文章介绍了常用的设计时Attribute。其中BrowsableAttribute,CategoryAttribute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉,可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了。
962 0