• 扩展 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 中输入文字了

    效果图


     代码下载

  • 相关阅读:
    Stuts2的"struts.devMode"设置成true后,不起作用,仍需要重启tomcat
    Javascript和Java获取各种form表单信息的简单实例
    cascade 介绍与用法 ( oracle)
    Struts2拦截器的使用 (详解)
    关于ActionContext.getContext()的用法心得
    mySQL中如何给某一IP段的用户授权?
    【BZOJ4260】Codechef REBXOR (Trie树)
    【BZOJ4500】矩阵(差分约束)
    【BZOJ2054】疯狂的馒头(并查集,线段树)
    【BZOJ1005】[HNOI2008]明明的烦恼(prufer序列)
  • 原文地址:https://www.cnblogs.com/michaelhuwei/p/1301290.html
Copyright © 2020-2023  润新知