【winform】解决datagridview里放combox,combox不能按下键快速选择的问题
效果图:
一开始,是拖个下拉框到窗体上,用dgv.controls.Add(combox)添加到表格里,在通过表格事件,触发时,改变下拉框的位置和大小,这样做,下拉框是会出现在表格里,但是有问题,不能通过键盘的下键进行快速筛选,当表格有多行时,在下拉框列按下键会先打开下拉框的选项列表,不过打开了又立马缩回去了,然后选中的下拉框就跳到一下行的下拉框去了。
本来想通过 表格 keydown事件 禁用 上下键,但测试时发现,在下拉框列按下键,还是会跳行,其他列的确不会在跳行了。所以这样做不得行。
后来,我想,加个panel panel里在加下拉框,把panel添加到表格里,这样还是不得行。
再后来,我想,直接在表格上的下拉框列覆盖一个下拉框,但我发现,如果不用dgv.controls.add()方法添加下拉框,你在设计窗体时,把其他控件拖动到表格控件上,其他控件是会被遮住的,根本显示不了,所以这样做也不得行。
最后我想,那就把表格自带的combox列扩展成能输入的下拉框列,最后这样做就行了。扩展表格自带的下拉框列是我找的网上的代码:c#——Winform DatagridView 扩展支持combobox列自定义DropDownStylehttps://blog.csdn.net/Shiyaru1314/article/details/52043688
代码拿过来,改了一点点
combo.DataSource == null 改成了combo.Items != null 删了 combo.DropDownHeight = 1;这句
然后是我自己写的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //模糊查询Combobox public void selectCombobox(ComboBox cb, List< string > listOnit) { //输入key之后返回的关键词 List< string > listNew = new List< string >(); //清空combobox cb.Items.Clear(); //清空listNew listNew.Clear(); //遍历全部备查数据 foreach ( var item in listOnit) { if (item.ToLower().Contains(cb.Text.ToLower())) { //符合,插入ListNew listNew.Add(item); } } //combobox添加已经查询到的关键字 cb.Items.AddRange(listNew.ToArray()); //设置光标位置,否则光标位置始终保持在第一列,造成输入关键词的倒序排列 cb.SelectionStart = cb.Text.Length; //保持鼠标指针原来状态,有时鼠标指针会被下拉框覆盖,所以要进行一次设置 Cursor = Cursors.Default; } |
做的时候,一定要保持对combox的引用,不然就会出现内存错误的异常,因为combox会释放掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private void DataGridView1_EditingControlShowing( object sender, DataGridViewEditingControlShowingEventArgs e) { var EditingControl = e.Control as ComboBox; if (EditingControl != null ) { //用个集合成员保持对combox的引用 if (ListCbx.Contains(EditingControl)) { EditingControl = ListCbx.Find(x => x == EditingControl); } else { EditingControl.Items.Clear(); EditingControl.Items.AddRange( new String[] { "Beijing" , "Shanghai" , "Shanghaiw" , "Shangwhai" , "Shawnghai" , "Sheenghai" , "Shangwwhai" , "Guangzhou" , "Wuhan" , "李斌一" , "李斌二" , "Wuha" , "Shenzhen" }); ListCbx.Add(EditingControl); EditingControl.TextUpdate += EditingControl_TextChanged; EditingControl.KeyDown += EditingControl_KeyDown; } } } |
分类:
C#
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版