C# ComboBox 下拉显示层次(树)

数据库中很多时候用到树形结构,在界面上显示时如果是下拉框一次性显示时需要树结构来体现,看个效果图先:

主要是用算法补空格,补符号,源码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private List<profile> pList;
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);

pList = new List<profile>();
pList.AddRange(new profile[] {

new profile { Id = 1, parentId=0, value="A级"},
new profile { Id = 2, parentId=0, value="A级"},
new profile { Id = 3, parentId=0, value="A级"},
new profile { Id = 4, parentId=0, value="A级"},
new profile { Id = 5, parentId=0, value="A级"},

new profile { Id = 6, parentId=1, value="B级"},
new profile { Id = 7, parentId=2, value="B级"},
new profile { Id = 8, parentId=2, value="B级"},
new profile { Id = 9, parentId=4, value="B级"},
new profile { Id = 10, parentId=3, value="B级"},

new profile { Id = 11, parentId=7, value="C级"},
new profile { Id = 12, parentId=7, value="C级"},
new profile { Id = 13, parentId=9, value="C级"},
new profile { Id = 14, parentId=9, value="C级"},
new profile { Id = 15, parentId=10, value="C级"},
new profile { Id = 16, parentId=10, value="C级"},

new profile { Id = 17, parentId=13, value="D级"},
new profile { Id = 18, parentId=13, value="D级"},
new profile { Id = 19, parentId=12, value="D级"},

new profile { Id = 20, parentId=17, value="E级"},
new profile { Id = 21, parentId=18, value="E级"},
new profile { Id = 22, parentId=18, value="E级"},

new profile { Id = 23, parentId=21, value="F级"},
new profile { Id = 24, parentId=23, value="G级"},
new profile { Id = 25, parentId=24, value="H级"},

new profile { Id = 26, parentId=12, value="D级"},
new profile { Id = 27, parentId=26, value="E级"},
new profile { Id = 28, parentId=27, value="F级"},

});

//实例化一个根节点
profile rootRoot = new profile();
rootRoot.Id = 0;
rootRoot.parentId = 0;
rootRoot.name = "顶级";

AppendChildren(pList, rootRoot, 0);

List<string> _name = new List<string>();
getName(rootRoot, _name);
ArrayList list = new ArrayList();
for (int i = 0; i < _name.Count; i++) {
list.Add(new System.Collections.DictionaryEntry(i, _name[i]));
}
comboBox1.DataSource = list;
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

//用treeView控件显示
var node = new TreeNode("顶级");
this.AddTree(node, 0);
this.treeView1.Nodes.Add(node);

return;
}
public void AddTree(TreeNode parentNode, int parentId) {
var selectedList = pList.FindAll(item => item.parentId == parentId);
foreach (var group in selectedList) {
var node = parentNode.Nodes.Add(group.Id.ToString(), group.value);
AddTree(node, group.Id);
}
}

private List<int> tag = new List<int>();
private void getName(profile p, List<string> name) {

//this.listBox1.Items.Add(string.Format("{0}-{1}", p.Id, p.parentId));
if (p == null) return;
var str = string.Empty;

for (var i = 1; i < p.level; i++) {
if (tag.Contains(i)) {
str += " ";
} else {
str += "│ ";
}
}
name.Add(string.Format("{0}{1}{2}", str, p.name, p.value, p.parentId, p.Id, p.level));
for (int i = 0; i < tag.Count; i++) {
if (tag[i] >= p.level) {
tag.Remove(tag[i]);
}
}
if (p.tag == 0) tag.Add(p.level);
if (p.profileList != null && p.profileList.Count > 0) {
foreach (profile x in p.profileList) {
getName(x, name);
}
}
}

public void AppendChildren(List<profile> list, profile profile, int count) {
try {
count++;
var id = profile.Id;
var subItems = list.Where(ee => ee.parentId == id).ToList();
if (subItems.Count > 0) {
for (int i = 0; i < subItems.Count; i++) {
if (i == subItems.Count - 1) {
subItems[i].name = string.Format("{0}{1}", "└--", "");
} else {
subItems[i].name = string.Format("{0}{1}", "├--", "");
}
subItems[i].level = count;
subItems[i].tag = i == subItems.Count - 1 ? 0 : 1;
}

profile.profileList = new List<profile>();
profile.profileList.AddRange(subItems);
}
foreach (var subItem in subItems) {
AppendChildren(list, subItem, count);
}
} catch (Exception e) {
MessageBox.Show(e.Message);
}
}
}

public class profile {
public string fill { get; set; }
public int tag { get; set; }
public string name { get; set; }
public int Id { get; set; }
public int parentId { get; set; }
public string value { get; set; }
public int level { get; set; }
public List<profile> profileList { get; set; }
}

————————————————
版权声明:本文为CSDN博主「Mars-Huang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/drupe/article/details/100975071

数据库中很多时候用到树形结构,在界面上显示时如果是下拉框一次性显示时需要树结构来体现,看个效果图先:

主要是用算法补空格,补符号,源码如下:
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Windows.Forms; namespace WindowsFormsApplication1 {    public partial class Form1 : Form {        public Form1() {            InitializeComponent();        }        private List<profile> pList;        protected override void OnLoad(EventArgs e) {            base.OnLoad(e);             pList = new List<profile>();            pList.AddRange(new profile[] {                   new profile { Id = 1, parentId=0, value="A级"},                  new profile { Id = 2, parentId=0, value="A级"},                  new profile { Id = 3, parentId=0, value="A级"},                  new profile { Id = 4, parentId=0, value="A级"},                  new profile { Id = 5, parentId=0, value="A级"},                   new profile { Id = 6, parentId=1, value="B级"},                 new profile { Id = 7, parentId=2, value="B级"},                  new profile { Id = 8, parentId=2, value="B级"},                  new profile { Id = 9, parentId=4, value="B级"},                  new profile { Id = 10, parentId=3, value="B级"},                                                  new profile { Id = 11, parentId=7, value="C级"},                 new profile { Id = 12, parentId=7, value="C级"},                  new profile { Id = 13, parentId=9, value="C级"},                 new profile { Id = 14, parentId=9, value="C级"},                 new profile { Id = 15, parentId=10, value="C级"},                 new profile { Id = 16, parentId=10, value="C级"},                                 new profile { Id = 17, parentId=13, value="D级"},                 new profile { Id = 18, parentId=13, value="D级"},                  new profile { Id = 19, parentId=12, value="D级"},                                                new profile { Id = 20, parentId=17, value="E级"},                new profile { Id = 21, parentId=18, value="E级"},               new profile { Id = 22, parentId=18, value="E级"},                  new profile { Id = 23, parentId=21, value="F级"},                                new profile { Id = 24, parentId=23, value="G级"},                new profile { Id = 25, parentId=24, value="H级"},                   new profile { Id = 26, parentId=12, value="D级"},                                new profile { Id = 27, parentId=26, value="E级"},                new profile { Id = 28, parentId=27, value="F级"},                              });              //实例化一个根节点            profile rootRoot = new profile();            rootRoot.Id = 0;            rootRoot.parentId = 0;            rootRoot.name = "顶级";             AppendChildren(pList, rootRoot, 0);             List<string> _name = new List<string>();            getName(rootRoot, _name);            ArrayList list = new ArrayList();            for (int i = 0; i < _name.Count; i++) {                list.Add(new System.Collections.DictionaryEntry(i, _name[i]));            }            comboBox1.DataSource = list;            comboBox1.DisplayMember = "Value";            comboBox1.ValueMember = "Key";              //用treeView控件显示            var node = new TreeNode("顶级");            this.AddTree(node, 0);            this.treeView1.Nodes.Add(node);             return;        }        public void AddTree(TreeNode parentNode, int parentId) {            var selectedList = pList.FindAll(item => item.parentId == parentId);            foreach (var group in selectedList) {                var node = parentNode.Nodes.Add(group.Id.ToString(), group.value);                AddTree(node, group.Id);            }        }         private List<int> tag = new List<int>();        private void getName(profile p, List<string> name) {             //this.listBox1.Items.Add(string.Format("{0}-{1}", p.Id, p.parentId));            if (p == null) return;            var str = string.Empty;              for (var i = 1; i < p.level; i++) {                if (tag.Contains(i)) {                    str += "    ";                } else {                    str += "│  ";                }            }            name.Add(string.Format("{0}{1}{2}", str, p.name, p.value, p.parentId, p.Id, p.level));            for (int i = 0; i < tag.Count; i++) {                if (tag[i] >= p.level) {                    tag.Remove(tag[i]);                }            }            if (p.tag == 0) tag.Add(p.level);            if (p.profileList != null && p.profileList.Count > 0) {                foreach (profile x in p.profileList) {                    getName(x, name);                }            }        }             public void AppendChildren(List<profile> list, profile profile, int count) {            try {                count++;                var id = profile.Id;                var subItems = list.Where(ee => ee.parentId == id).ToList();                if (subItems.Count > 0) {                    for (int i = 0; i < subItems.Count; i++) {                        if (i == subItems.Count - 1) {                            subItems[i].name = string.Format("{0}{1}", "└--", "");                        } else {                            subItems[i].name = string.Format("{0}{1}", "├--", "");                        }                        subItems[i].level = count;                        subItems[i].tag = i == subItems.Count - 1 ? 0 : 1;                    }                     profile.profileList = new List<profile>();                    profile.profileList.AddRange(subItems);                }                foreach (var subItem in subItems) {                    AppendChildren(list, subItem, count);                }            } catch (Exception e) {                MessageBox.Show(e.Message);            }        }    }     public class profile {        public string fill { get; set; }        public int tag { get; set; }        public string name { get; set; }        public int Id { get; set; }        public int parentId { get; set; }        public string value { get; set; }        public int level { get; set; }        public List<profile> profileList { get; set; }    }
————————————————版权声明:本文为CSDN博主「Mars-Huang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/drupe/article/details/100975071

原文地址:https://www.cnblogs.com/ljs-13/p/12109171.html

时间: 2024-10-07 08:58:02

C# ComboBox 下拉显示层次(树)的相关文章

input输入框下拉显示tree树

这次做项目还用到了另一个tree树的插件,就是input输入框下拉tree树 我这只是简单的下拉显示tree树,没有tree树的添加.编辑.删除.移动等操作 先看图片 zTree官方API文档 http://www.treejs.cn/v3/api.php 上代码 引入的js <script src="js/jquery-1.4.4.min.js" type="text/javascript"></script> <link href=

extjs4 分页工具栏pagingtoolbar的每页显示数据combobox下拉框

var itemsPerPage = 20; var combo; //创建数据源store Ext.define('recordStore', { extend : 'Ext.data.Store', // autoLoad : { // start : 0, // limit : itemsPerPage // }, start : 0, limit : itemsPerPage, pageSize : itemsPerPage, model : 'recordModel', proxy :

easyui的combobox下拉框初始化默认值以及保持该值一直显示的方法

easyui的combobox下拉框默认初始值是空,下面是实现从远程加载数据之后初始化默认值,以及让该值一直排在下拉框的最顶部的方式. 目前的需求是需要在初始化的时候添加"全部数据库"字段,并且在下拉的时候,"全部数据库"一直排在最顶部. 初始化效果如下: 下拉之后的效果如下: 实现方式: easyui的combobox有一个loader属性,easyui的API对loader属性说明如下: easyui的combobox有一个onLoadSuccess事件,eas

WinForm多窗体间操作,ComboBox下拉菜单控件

1.通过操作一个窗体打开另一个窗体 已有窗体为Form1.Form1中有一个按钮,对该按钮编写点击事件: Form2 f2 = new Form2();f2.Show(); 通过这段代码来打开Form2. 在实际应用中会出现代开Form2后需要Form1隐藏的情况,此时可以加入代码:this.Hide();来实现隐藏Form1. [不能关闭Form1,如果关闭Form1,那么Form2也会关闭,因为Form1是主窗体] 2.在窗体之间进行值的传递 在某些情况下,需要用到某个已经获取到的值,为了提

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab

自绘制HT For Web ComboBox下拉框组件

传统的HTML5的下拉框select只能实现简单的文字下拉列表,而HTforWeb通用组件中ComboBox不仅能够实现传统HTML5下拉框效果,而且可以在文本框和下拉列表中添加自定义的小图标,让整个组件看起来更直观,今天我就如何制定ComboBox自定义下拉框做一番探讨. 首先我们先来目睹下效果:   看起来跟普通的ComboBox好像也没什么特殊的,是的,按照规范的ComboBox设计,完全可以实现同样的效果,但是今天的主要任务并不是讨论有多少实现方案,今天的首要任务是介绍HT for We

Devexpress GridControl 设置combobox下拉框

GridControl 设置combobox下拉框 //设置combobox下拉框        private void GetComboBox(string str)        {            RepositoryItemComboBox combobox = new RepositoryItemComboBox();            combobox.Items.Add(str);            combobox.AllowNullInput = DevExpr

DataGridView单元格内容自动匹配下拉显示

页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信息,并且单元格处于编辑模式时显示一个查询图标的按钮,点击该按钮也将显示数据库中所有商品信息. KryptonDataGridView显示控件此处命名为kDGVIndentDetail; 用于下拉显示匹配内容的DataGridView命名为dgv; 1.建立一个DataGridView类型的页面变量用

sencha combobox下拉框不用jsonstore,直接使用字符串数组做数据源

combobox下拉框的store除了可以选择一个jsonstore来加载数据,还可以直接写成字符串Array的形式. { xtype: 'combobox', fieldLabel: 'Label', store: [ 'aa', 'bb', 'cc' ], listeners: { change: { fn: me.onComboboxChange, scope: me } } } sencha architecture里设置如下(点击store前面的小图标弹出选择项,选择Array,然后直