zoukankan      html  css  js  c++  java
  • 扩展 DataGridView 的功能(二)

    二、加入可以输入文字的 DataGridViewComboBoxCell

    DataGridView 的功能确实很强大,要实现在 grid 中加入 ComboBox , 只需要将grid列的类型改为 DataGridViewComboBoxColumn 即可

    DataGridViewComboBoxColumn 也是从 DataGridViewColumn 中继承过来的

    public class DataGridViewComboBoxColumn : DataGridViewColumn

    在 Combobox  中加入选项值也是很简单的,不在赘述。

    但系统自带的 DataGridViewComboBoxColumn 有个致命的缺点,就是它的 DropDownStyle 默认是 ComboBoxStyle.DropDownList,也就是

    说下拉列表只能选择,不能输入文字,这样就极其不爽了,所以我们现在就要来扩展这个功能

    定义新的 columns类, 当然要继承自DataGridViewComboBoxColumn 

        /// <summary>
        
    /// 可修改 DropDownStyle 的 DataGridViewComboBoxColumn
        
    /// </summary>

        public class DataGridViewComboBoxColumnEx : DataGridViewComboBoxColumn 

    这个类只需要添加了一个属性

    DropDownStyle 属性

    因为主要的功能都是在 DataGridViewEx 中实现的, 呵呵

    回到 DataGridViewEx 中, 重写 OnEditingControlShowing 方法,看字面意思就知道,这个方法是在 grid 的任何“编辑控件”显示时调用

    看到这个我想大家都明白了, 我们只要在 ComboBox 控件显示出来时修改它的样式即可

            protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
            {
                
    if (CurrentCell != null && CurrentCell.OwningColumn is DataGridViewComboBoxColumnEx)
                {
                    DataGridViewComboBoxColumnEx col 
    = CurrentCell.OwningColumn as DataGridViewComboBoxColumnEx;
                    
    //修改组合框的样式
                    if (col.DropDownStyle != ComboBoxStyle.DropDownList)
                    {
                        ComboBox combo 
    = e.Control as ComboBox;
                        combo.DropDownStyle 
    = col.DropDownStyle;
                        combo.Leave 
    += new EventHandler(combo_Leave);
                    }
                }
                
    base.OnEditingControlShowing(e);

            }

    上面可以看到, 修改了样式后,还需要为 ComboBox 控件绑定一个事件,这是为了能在 ComboBox 失去焦点时更新 Cell 的值

            /// <summary>
            
    /// 当焦点离开时,需要将新输入的值加入到组合框的 Items 列表中
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            void combo_Leave(object sender, EventArgs e)
            {
                ComboBox combo 
    = sender as ComboBox;
                combo.Leave 
    -= new EventHandler(combo_Leave);
                
    if (CurrentCell != null && CurrentCell.OwningColumn is DataGridViewComboBoxColumnEx)
                {
                    DataGridViewComboBoxColumnEx col 
    = CurrentCell.OwningColumn as DataGridViewComboBoxColumnEx;
                    
    //一定要将新输入的值加入到组合框的值列表中
                    
    //否则下一步给单元格赋值的时候会报错(因为值不在组合框的值列表中)
                    col.Items.Add(combo.Text);
                    CurrentCell.Value 
    = combo.Text;
                }

            }

    OK了, 很简单, 所有的工作都完成了, 只需要创建一个 DataGridViewComboBoxColumnEx 列,并将 DropDownStyle 属性设置为 DropDown,

    就可以在 ComboBox 中输入文字了

    效果图


     代码下载

  • 相关阅读:
    Mysql group by语句的优化
    Mysql join语句的优化
    jquery 只读
    【Unity Shaders】Transparency —— 使用渲染队列进行深度排序
    oracle多表查询之内连接,外连接语句总结
    String比较相等的问题探索
    markdown实例
    集合list里存储list,要遍历最底层list的对象元素的遍历方法
    System.out.println(i++); System.out.println(++i);的区别
    windows自动快捷方式
  • 原文地址:https://www.cnblogs.com/michaelhuwei/p/1301290.html
Copyright © 2011-2022 走看看