本文转载自:http://blog.csdn.net/zx13525079024/article/details/4814642

我们如果想自定义实现datagridview的某列,例如是datagridview的某列显示为一个日期控件datatimepicker,或者颜色拾取器控件colorpicker,我们可以大致按如下模式来设计

1. 设置列,创建一个类,使之继承DataGridViewColumn列

public partial class DataGridViewCalendarColumn : DataGridViewColumn

{

public DataGridViewCalendarColumn():base(new DataGridViewCalendarCell())
        {
           
        }

//获取或设置用于创建新单元格的模板。

public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                //确保单元格式一个DataGridViewCalendarCell]

//一个 DataGridViewCell,列中的所有其他单元格都以它为模型。默认值为新的 DataGridViewLinkCell 实例。
                if (value!=null&&!value.GetType().IsAssignableFrom(typeof(DataGridViewCalendarCell)))
                {
                    throw new InvalidCastException("必须是一个日历单元格");
                }
                base.CellTemplate = value;
            }
        }

}

2.设置单元格,创建一个类,使之继承DataGridViewTextBoxCell列

public class DataGridViewCalendarCell : DataGridViewTextBoxCell
    {
        public DataGridViewCalendarCell()
            : base()
        {
            this.Style.Format = "d";
        }

//附加并初始化寄宿的编辑控件。

//rowIndex
//类型:System..::.Int32

//该单元格父行的索引。

//initialFormattedValue
//类型:System..::.Object

//要在控件中显示的初始值。

//dataGridViewCellStyle
//类型:System.Windows.Forms..::.DataGridViewCellStyle

//一个 DataGridViewCellStyle,确定寄宿控件的外观。

public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
        }

//获取或设置单元格中值的数据类型。

public override Type ValueType
        {
            get
            {
                return typeof(DateTime);
            }
        }

//获取单元格的寄宿编辑控件的类型。

public override Type EditType
        {
            get
            {
                return typeof(DataGridViewCalendarEditingControl);
            }
        }

//获取新记录所在行中单元格的默认值

public override object DefaultNewRowValue
        {
            get
            {
                return DateTime.Now;
            }
        }

}
3.设置单元格处于编辑状态显示的控件,创建一个类,使之继承要在单元格显示的控件和IDataGridViewEditingControl接口

// IDataGridViewEditingControl 接口
//定义承载在 DataGridView 的单元格内的控件的常见功能。 
    class DataGridViewCalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
    {

int rowIndex;//定义行索引
        DataGridView dataGridView;//定义datagridview
        private bool valueChanged = false;//定义单元格值是否变化
        
         public DataGridViewCalendarEditingControl()
         {

//当前类继承DateTimePicker,具有DateTimePicker的功能,在构造函数中设置初始化日期格式
             this.Format = DateTimePickerFormat.Short;
         }

//实现 the IDataGridViewEditingControl.EditingControlFormattedValue属性

//获取或设置编辑器正在修改的单元格的格式化值。

//格式化值以值在控件的用户界面上的显示形式表示该值。格式化值的绝对值甚至数据类型都可能与控件中包含的实际值不同。
         public object EditingControlFormattedValue
         {
             get
             {
                 return this.Value.ToShortDateString();
             }
             set
             {
                 string newValue = value as string;
                 if (newValue!=null)
                 {
                     this.Value = DateTime.Parse(newValue);
                 }
             }
         }

#region IDataGridViewEditingControl 成员
         // 实现 the IDataGridViewEditingControl.ApplyCellStyleToEditingControl
         // method,用于设置单元格样式
         public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
         {
             this.Font = dataGridViewCellStyle.Font;
             this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
             this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
         }

// Implements the IDataGridViewEditingControl.EditingControlDataGridView
         // property.//用于设置当前的datagridview

public DataGridView EditingControlDataGridView
         {
             get
             {
                 return dataGridView;
             }
             set
             {
                 dataGridView = value;
             }
         }

// 实现 the IDataGridViewEditingControl.EditingControlRowIndex
        // property.//设置处于编辑状态的datatridview控件的行索引

public int EditingControlRowIndex
         {
             get
             {
                 return rowIndex ;
             }
             set
             {
                 rowIndex = value;
             }
         }

// Implements the IDataGridViewEditingControl.EditingControlValueChanged
         // property.获取或设置控件值是否发生变化
         public bool EditingControlValueChanged
         {
             get
             {
                 return valueChanged;
             }
             set
             {
                 valueChanged = value ;
             }
         }

// 实现 the IDataGridViewEditingControl.EditingControlWantsInputKey
         // method. 确定指定的键是应由编辑控件处理的常规输入键,还是应由 DataGridView 处理的特殊键。

//DataGridView 控件调用此方法确定是要处理某个输入键还是让编辑控件处理它。

//如果 keyData 包括 Up 或 Down 值,或者如果显示了下拉列表并且 keyData 包括 Escape 或 Enter 值,则此方法返回 true

//如果 //dataGridViewWantsInputKey 为 false,此方法也会返回 true。否则,此方法返回 false

public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
         {
             switch (keyData&Keys.KeyCode)
             {
                case Keys.Left:
                case Keys.Up:
                case Keys.Down:
                case Keys.Right:
                case Keys.Home:
                case Keys.End:
                case Keys.PageDown:
                case Keys.PageUp:
                    return true;
                default:
                    return false;
             }
         }

// Implements the IDataGridViewEditingControl.EditingPanelCursor
         // property

//编辑面板是在 DataGridView 控件处于编辑模式时用来承载编辑控件的 Panel。实际的编辑控件可能不会覆盖编辑面板的整个区域。

//在这种情况下,EditingPanelCursor 实现应返回当鼠标指针位于面板上方但不位于控件上方时使用的光标。通常,

//您会希望返回与控件使用的光标相同的光标。如果希望更改当指针位于控件上方时显示的光标,必须设置 Cursor 属性。可以在

//IDataGridViewEditingControl 实现的构造函数中设置此属性,也可以在 PrepareEditingControlForEdit 实现中设置。 
         public Cursor EditingPanelCursor
         {
             get {
                 return base.Cursor;
             }
         }

// 实现 the IDataGridViewEditingControl.GetEditingControlFormattedValue
         // method.//检索单元格的格式化值。

public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
         {
            return EditingControlFormattedValue;
         }

//准备当前选中的单元格以进行编辑。

//

//selectAll
//类型:System..::.Boolean

//为 true,则选择单元格的全部内容;否则为 false

//

//此方法的用途是准备控件及其内容以进行编辑。例如,您可能想要将插入点放在内容的末尾,或者更改内容的对齐方式。

public void PrepareEditingControlForEdit(bool selectAll)
         {
             //throw new NotImplementedException();
         }

//实现 the IDataGridViewEditingControl.RepositionEditingControlOnValueChange
        // property.

//取得值,指出每當值變更時是否需要重新定位儲存格內容。

public bool RepositionEditingControlOnValueChange
         {
             get
             {
                 return false;
             }
         }

//当datatimepicker值变化时,通知datagridview

protected override void OnValueChanged(EventArgs eventargs)
         {
            // Notify the DataGridView when the cell's contents was changed.

valueChanged = true;

//通知DATAGRIDVIEW有未提交的更改,

//

如果要指示该单元格有未提交的更改,为 true;否则为 false

this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
             base.OnValueChanged(eventargs);
         }

#endregion
    }

转载于:https://www.cnblogs.com/wpcnblog/p/5093830.html

(转)datagridview 自定义列三步走相关推荐

  1. vue自定义组件三步走

    如图所示:我自定义了两个组件,一个是Head.vue,一个是Foot.vue 我现在在Page01.vue中用他们两个,公分三步 1,引用 2,注册 3,使用

  2. 运营商的“大网”怎么建? 三大运营商纷纷SDN/NFV三步走

    数据流量爆炸式增长,网络粗放型扩张难以为继已经成为不争的事实,引入IT技术和新的合作伙伴,追求低成本和高效率运营成为运营商构架未来网络的动力.而所有一切改造的两大技术基础是NFV和SDN,简而言之:N ...

  3. 【OpenVINO+paddle】覆盖300多种飞桨算法-PPHub+PP2ONNX+IR部署三步走

    [OpenVINO+paddle]覆盖300多种飞桨算法-PPHub+PP2ONNX+IR部署三步走 这篇博客我提供了一个全新的openvino部署思路,并且通过这个思路您可以直接调用300多种飞桨算 ...

  4. ai皮肤检测分数_智能AI皮肤检测仪三步走话术

    智能 AI 皮肤检测仪三步走话术 第一步:仪器介绍 话术: 某某小姐,您好!我们现在用了是 德国进口智能 AI 皮肤检测仪 给您的皮肤做拍照 测试. 我们这台仪器是国外引起的一台专业皮肤定量分析仪器, ...

  5. 软件需求分析--三步走

    软件项目如何进行需求分析,要解决这个问题,我们要分三步走 第一步:通过什么方式去了解需求 了解需求的方式有好几种: (1)直接与客户交谈.如果分析人员生有足球评论员的那张"大嘴", ...

  6. Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

    短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...

  7. 经验分享:三步走教你升级企业NAS设备

       前几年凡是对于数据存储有需求的企业都已经购买了相关的NAS产品,不过电脑和网络升级换代是比较频繁的,几年过去了中小企业对数据存储的需求也水涨船高,然而面对当初的NAS存储设备该如何处理呢?扔掉可 ...

  8. 搞定面试算法系列 | 分治算法三步走

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...

  9. 开发经验分享_01_遇到问题三步走(思路+实战)

    企业内部开发经验系列,由gblfy根据自己在公司的亲身经历总结而成,会讲述开发的思路和开发技巧,帮助更多开发人员思路明确.高效率的开发!!! 目前总结章节如下: 章节 链接 (企业内部)开发经验分享_ ...

最新文章

  1. 某面试官面试一个百度T7程序员,出了一道这样的coding题!T7竟不会!被面试官嘲笑!...
  2. Asp.Net 章节验证控件章节测试题
  3. 多兼容的JS获取鼠标坐标
  4. CSS基础选择器之类选择器(CSS、HTML)
  5. php 打印 域名ip_php如何获取域名IP地址代码函数
  6. 网吧服务器是起什么作用的,网吧服务器的用途是什么?
  7. golang 中文处理
  8. LHC或许已经首次制造出顶夸克“四胞胎”
  9. C/C++实现的游戏角色名称名字随机生成代码
  10. 静态单赋值(二)—gcc中的SSA化算法
  11. Microsoft Surface
  12. 3种不同脸型的瘦脸方法
  13. 智慧物流在互联网大时代下的发展趋势
  14. 想提前躺平的程序员,这10个网站收好了!
  15. 补充说一下120亿光年
  16. 数据处理(1):十万加SHP数据重载导入标准字段图层
  17. 2019秋招海康测试一面
  18. yolo-v3模型测试及测试结果转化
  19. 《统计学习方法》--李航 学习笔记
  20. 编写程序,兑换人民币零钞,要求将一张面值为100元人民币兑换成5元、1元和0.5元的零钞组合加起来也是100张,其中每种面值零钞不少于1张

热门文章

  1. iOS开发之设计模式篇
  2. inotify介绍及rsync + inotify 实时同步备份
  3. atitit.跨语言实现备份mysql数据库 为sql文件特性 api 兼容性java c#.net php js
  4. Google Map API V3调用arcgis发布的瓦片地图服务
  5. C#中DataGrid控件的基本使用
  6. 标题: Debian 下 VirtualBox 的桥接、USB 设置 ── 迷你怎么做 [转自sir]
  7. python中分支结构与c语言中有何区别_C语言的分支语句有哪几种?C语言分支结构的基本形式是什么,区别是什么?...
  8. Python 数据结构_堆栈
  9. Python Module_subprocess_子进程(程序调用)
  10. Python_List对象内置方法详解