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,但是无边框下我们需要保留移动窗体、拖拽调整大小、自定义美观好看的标题栏等...
2612 0
Winform控件优化之无边框窗体及其拖动、调整大小和实现最大最小化关闭功能的自定义标题栏效果
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
Qml实用技巧:在可视元素之前半透明覆盖一个可视元素,阻止鼠标透(界面)传(防止点击到被遮挡的按钮)
|
5月前
展开&收起,使用SwiftUI搭建一个侧滑展开页面交互
展开&收起,使用SwiftUI搭建一个侧滑展开页面交互
66 0
|
算法 API C#
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
最终优化实现ButtonPro按钮(继承自Button),既提供Button原生功能,又提供扩展功能,除了圆角以外,还实现了圆形、圆角矩形的脚尖效果、边框大小和颜色、背景渐变颜色...
1216 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
|
C# 图形学 Windows
Winform控件优化之圆角按钮【各种实现中的推荐做法】(上)
Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化...尝试介绍很常见的圆角效果,通过重写控件的OnPaint方法实现绘制,并在后面进一步探索对应的优化和可能的问题
979 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(上)
|
设计模式
带你造轮子,自定义一个随意拖拽可吸边的悬浮View组件
在开发中,随意拖拽可吸边的View还是比较常见的,这种功能网上也有各种各样的轮子,其实写起来并不复杂,看完本文,你也可以手写一个,不到400行代码就能实现一个通用的随意拖拽可吸边的View组件。
523 1
SwiftUI—预览视图在正常模式和黑暗模式下的效果
SwiftUI—预览视图在正常模式和黑暗模式下的效果
117 0
SwiftUI—预览视图在正常模式和黑暗模式下的效果
MFC Ribbon开发中编辑框、下拉框始终为灰色的问题解决
MFC Ribbon开发中编辑框、下拉框始终为灰色的问题解决
248 0
|
Web App开发 SQL JavaScript
【自然框架】分享 n级联动下拉列表框
  特点:1、 使用js方法,把需要的数据一次性写入到页面里,然后用js来实现联动的效果。2、 支持n级。3、 封装成了服务器控件,所以使用非常简单。4、 支持在回发的时候保持状态。5、 支持修改记录的时候设置默认选项。
1226 0
|
SQL JavaScript 前端开发
【自然框架】之鼠标点功能现(二):表单控件的“应用”—— 代码?只写需要的!
  【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】           看了大家的回复,好像不少人误会了,我为了突出“鼠标点,功能现”,所以没有说代码,没有贴代码,这就让一些人认为我想要完全抛弃VS,自己写一个“平台”来代替,不好意思,您高估我了,我可达不到。
842 0