zoukankan      html  css  js  c++  java
  • 【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;这句
     
    然后是我自己写的代码
      //模糊查询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会释放掉。
    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;
                    }
                }
            }
    
  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/14902296.html
Copyright © 2011-2022 走看看