本文转载自: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
    }

(转)datagridview 自定义列三步走的更多相关文章

  1. git 三步走

    git三步走: git add .        (注:别忘记后面的.,此操作是把Test文件夹下面的文件都添加进来) git commit  -m  "提交信息"  (注:“提交 ...

  2. Python学习笔记(一)三步走安装pip

    pip是用来方便地管理Python的第三方包的,由于此前玩Python仅仅是浅尝辄止,用的是python(x,y),但是这里并不代表你想用什么包都能从里面找到的,所以我把python(x,y)卸了,然 ...

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

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

  4. 用powershell+excel行列转置三步走

    本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...

  5. mongodb安装和配置三步走

    最近在重新学习node,所以和同事一起搞了个模仿新浪微博的项目,项目刚开始,所以其他的东西就暂时先不提.这里介绍下mongodb的安装.直接搜索可以看到很多介绍,但是我第一次是失败了,不过看了好几个还 ...

  6. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

  7. 三步走起 提升 iOS 审核通过率 下篇

    根据2015年的数据统计情况,并结合<苹果应用商店审核指南>,互娱 iOS 预审组通过细分将预审工作划为3大模块:客户端资源检查.应用内容检查和提审资源检查. 在上一篇文章中,Bugly ...

  8. 三步走起 提升 iOS 审核通过率 上篇

    <ignore_js_op> Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明 ...

  9. 【php学习】图片处理三步走

    前两天要对一张图片进行处理,其实很简单,就是在图片上加上字符串,一个图片而已,但是自己如同得了短暂性失忆似的,图片操作的函数一个都想不起来.所以就抽空整理了一下图片操作函数. 1. 创建画布 从文件中 ...

随机推荐

  1. php 操作Redis发送短信

    循环查询redis队列里面的数据 然后提交数据后将反馈信息再写入另一个 redis list里面 代码 <?php /** * System Name: sent message * User: ...

  2. Java的同名属性、同名普通函数、同名静态函数,是否被覆盖

    作者按:虚拟函数的概念早就滚瓜烂熟了.但是今天面试发现:1.同名属性,2.同名普通函数,3.同名静态函数,是否被覆盖的问题.请看下面三个例子: 例子1:测试父类的属性是否存在和被完全覆盖class A ...

  3. 坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求

    本文链接:https://blog.csdn.net/qq_26909801/article/details/96966372数值型坐标轴刻度计算算法前言算法描述上代码代码运行效果结语前言因实习的公司 ...

  4. express热更新nodemon,自启动项目

    一.说一下 每次修改文件,我们都需要重启服务器npm start,很麻烦,所以使用引入nodemon插件,解决这个问题,实现保存文件,即自启动刷新项目 二.直接开码 npm install nodem ...

  5. 如何设置一个App的缓存机制

    在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个 ...

  6. 一、SignalR使用心得

    一.通讯模式 以往,我们聊天发消息模式(单体发送消息或通知)-好友(一对一).群组(一对多),方便管理好友-分组方式. 那么聊天和好友管理参考qq,刷新分组标签也页面就会从新加载分组列表和分组内好友列 ...

  7. 一、在 ASP.NET Core 中使用 SignalR

    一.介绍 SignalR 是一个用于实现实时网站的 Microsoft .NET 库.它使用多种技术来实现服务器与客户端间的双向通信,服务器可以随时将消息推送到连接的客户端. https://docs ...

  8. 用户在浏览器输入URL或者跳转到一个URL后发生了什么

    一.从URL到页面渲染的整个过程1)处理用户输入2)开始导航3)读取响应4)查找渲染进程5)确认导航6)渲染页面 二.每一步做了哪些事情 1)处理用户的输入 浏览器的UI 线程处理用户的输入,判断是跳 ...

  9. <转>ThinkPHP的开发常用系统配置项

    /* 项目设定 */ ’APP_DEBUG’ => false, // 是否开启调试模式 ’APP_DOMAIN_DEPLOY’ => false, // 是否使用独立域名部署项目 ’AP ...

  10. linux shell 命令笔记

    标准输入.标准输出.标准错误 File descriptors are integers associated with an opened file or data stream. File des ...