(转)datagridview 自定义列三步走

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

时间: 2024-08-08 06:24:11

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

80后女孩买房三步走 短期增值是首步 资金 增值 理财_新浪财经_新浪网

三湘华声全媒体记者 梁兴 通讯员 王茜 [个案资料] 尹婵,今年28岁,是长沙一名普通的公司职员.步入社会5年以来,月收入一直在4500元左右,但因勤俭节约,月结余能达到3000元,年终奖5000元.目前有存款18万元,有"五险一金",无任何商业保险. 尹婵是土生土长的长沙姑娘,父母工资收入稳定.由于工作后仍和父母一起居住,不需要承担房租或房贷.虽然父母乐意提供食宿,但是尹婵不想做"啃老族",每月给父母800元"搭伙费". [财务诊断] 尹婵工作

ping排错三步走

ping排错三步走--------- 每次访问目标主机的过程是这样的: 客户端->网关->DNS->客户端(拿着解析出来的IP)->目标服务器 所以当ping不通的时候,就从这三个地方找问题,有以下三种可能: (1)网关不通 (2)DNS域名解析服务器不通 (3)主机服务器不通 一:ping 网关,如果网关不通: 可能原因:(1)网卡没起来 (2)网线断了 排查方式: (1)查看本地ip地址`ifconfig` ,是不是没连上网. (2)查看路由表`route -n` 是否有相同网

Ceph对象存储RGW对接企业级网盘OwnCloud三步走

上篇文章我们把Ceph对象存储搭建成功了,但是成功了之后我们怎么用呢?下面我们本文就来讲下Ceph对象存储对接企业私有云网盘OwnCloud. OwnCloud分为企业版和社区版,我们只说社区版,在这里我就不多赘述了. 那么Ceph对接OwnCloud分三步走. 第一:安装Ceph配置RGW对象存储 第二:安装OwnCloud 第三:对接 第一步在上个文章里面已经做了,那么第二步是安装OwnCloud,可以看下我之前的文章进行安装. 如何搭建OwnCloud网盘 主要讲下第三步 要点:网盘节点D

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

pip是用来方便地管理Python的第三方包的,由于此前玩Python仅仅是浅尝辄止,用的是python(x,y),但是这里并不代表你想用什么包都能从里面找到的,所以我把python(x,y)卸了,然后重新装了个Python2.7.5,准备尝试一下用pip来下载想要的包. 不过pip也有一个麻烦之处,如果电脑不能联网怎么办? 之后再考虑这个问题,先在此记录一下我是如何安装pip的.本文参考百度经验<如何在win7下安装python包工具pip>,网上有很多pip安装教程,但感觉这个写的是最简明

小学生手抄报制作三步走

小学生手抄报制作三步走      小学生手抄报,不管是英语手抄报.科技手抄报还是环保手抄报,不管是安全.数学.读书.迎奥运还是等方面的内容,大抵都有同样的要求.那么,如何制作一份精彩的手抄报呢?三个步骤:一.确定一个好的手抄报主题           手抄报只有小小一张纸,能够容纳的文章并不多.如果把一个话题方方面面的内容都堆上去,那给读者的感觉可不好.如果手抄报大赛的主题是“七月的滋味”,如果你把七月里怎么玩.怎么学.怎么旅游……统统写上去,就像把苦辣酸甜各种味道的菜搅在一起,味道可好不到哪儿

编写高质量代码——重载operator=的标准三步走

CString& CString::operator=(const CString& str){   if(this == &str)       //1.自赋值检查       return *this;          if(pChar!=NULL)       //2.释放原有空间     delete[]  pCahr;   pChar = new char[strlen(str.pChar)+1]; // 2.申请新空间   strcpy(pChar, str.pCha

(转)linux程序减肥三步走

对于设计嵌入式Linux系统的研发人员来说,有一个问题是必须要考虑到的,那就是存储器的空间. 我们知道嵌入式Linux系统所用的存储器不是软磁盘.硬盘.ZIP盘.CD-ROM.DVD这些众所周知的大容量常规存储器,它使用的是例如Rom, CompactFlash,M-Systems的DiskOnChip,SONY的MemoryStick,IBM的MicroDrive等体积极小,与主板上的BIOS大小相近,存储容量很小的存储器.所以怎样尽可能的节省空间就显的很重要.     嵌入式系统的存储器中放

Oracle创建&#39;数据库&#39;三步走

--创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m; --创建用户 create user wateruser identified by 011220 default tablespace waterboss; --用户赋权 grant dba to wateruser; Oracle创建'数据库'三步走 原文地址:https://www.cnblogs

git 三步走

git三步走: git add .        (注:别忘记后面的.,此操作是把Test文件夹下面的文件都添加进来) git commit  -m  "提交信息"  (注:"提交信息"里面换成你需要,如"first commit") git push -u origin master   (注:此操作目的是把本地仓库push到github上面,此步骤需要你输入帐号和密码) 有问题的话,看错误信息,对症解决. 原文地址:https://www.c