winform实现下拉控件的无限级联动(DevExpress版)
1程序用到了第三方的DevExpress控件
2属性

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构造函数

/// <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创建控件

/// <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准备控件

/// <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控件选择项变更的事件

/// <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显示控件

/// <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获取选中的值和文本

/// <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里不用任何第三方皮肤和控件再做一遍分享给网友吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?