扩展 DataGridView 的功能(一)

来源:互联网 发布:杭州创业软件口碑 编辑:程序博客网 时间:2024/06/07 05:57

grid 控件的重要性无需多说了,但要找一个好用的却是难上加难

虽然市面上有很多成熟公司的成熟产品, 但那些东西毕竟太贵了,所以还是自己写比较实在(什么, 破解版还是算了吧)

自vs2005 以后,vs 系统自带了一个 DataGridView 控件, 这个控件的功能是很强大的,扩展性也不错, 所以我们就以它为基础吧

开始统计需要扩展的功能先:

1.显示行号

2.加入可以输入文字的 DataGridViewComboBoxCell

2.可分组折叠

3.合并单元格

4.Undo/Redo的支持

5.其他。。。。。

定义类

///
///扩展的DataGridView
///
publicclassDataGridViewEx:DataGridView
{
}

先来一个最简单的:显示行号

这里我们用到了一个事件 RowPostPaint, 查看MSDN后可知该事件是在“绘制 DataGridViewRow 后发生”

DataGridView 在绘制 DataGridViewRow 时没有处理行号, 那就由 DataGridViewEx 来处理吧

知道了原理,添加行号就很简单了, DrawString 就OK。

给出主要的代码实现 :

voidDataGridViewEx_RowPostPaint(objectsender,DataGridViewRowPostPaintEventArgse)
{
if(showRowHeaderNumbers)
{
stringtitle=(e.RowIndex+1).ToString();
Brushbru
=Brushes.Black;
e.Graphics.DrawString(title,DefaultCellStyle.Font,
bru,e.RowBounds.Location.X
+RowHeadersWidth/2-4,e.RowBounds.Location.Y+4);
}
}

完成后的效果:

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

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

DataGridViewComboBoxColumn 也是从 DataGridViewColumn 中继承过来的

 

public class DataGridViewComboBoxColumn : DataGridViewColumn

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

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

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

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

 

    /// 
    
/// 可修改 DropDownStyle 的 DataGridViewComboBoxColumn
    
/// 

    public class DataGridViewComboBoxColumnEx : DataGridViewComboBoxColumn 

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

 


        /// 
        
/// 控制组合框的外观和功能
        
/// 
        [Description("控制组合框的外观和功能"), DefaultValue(ComboBoxStyle.DropDownList)]
        
public ComboBoxStyle DropDownStyle
        {
            
get { return dropDownStyle; }
            
set { dropDownStyle = value; }

 

因为主要的功能都是在 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

原创粉丝点击