(转)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
}
(转)datagridview 自定义列三步走的更多相关文章
- git 三步走
git三步走: git add . (注:别忘记后面的.,此操作是把Test文件夹下面的文件都添加进来) git commit -m "提交信息" (注:“提交 ...
- Python学习笔记(一)三步走安装pip
pip是用来方便地管理Python的第三方包的,由于此前玩Python仅仅是浅尝辄止,用的是python(x,y),但是这里并不代表你想用什么包都能从里面找到的,所以我把python(x,y)卸了,然 ...
- Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务
短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...
- 用powershell+excel行列转置三步走
本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...
- mongodb安装和配置三步走
最近在重新学习node,所以和同事一起搞了个模仿新浪微博的项目,项目刚开始,所以其他的东西就暂时先不提.这里介绍下mongodb的安装.直接搜索可以看到很多介绍,但是我第一次是失败了,不过看了好几个还 ...
- Spring Boot Starter自定义实现三步曲
实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...
- 三步走起 提升 iOS 审核通过率 下篇
根据2015年的数据统计情况,并结合<苹果应用商店审核指南>,互娱 iOS 预审组通过细分将预审工作划为3大模块:客户端资源检查.应用内容检查和提审资源检查. 在上一篇文章中,Bugly ...
- 三步走起 提升 iOS 审核通过率 上篇
<ignore_js_op> Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明 ...
- 【php学习】图片处理三步走
前两天要对一张图片进行处理,其实很简单,就是在图片上加上字符串,一个图片而已,但是自己如同得了短暂性失忆似的,图片操作的函数一个都想不起来.所以就抽空整理了一下图片操作函数. 1. 创建画布 从文件中 ...
随机推荐
- [集合]Map的 entrySet() 详解以及用法(四种遍历map的方式)
Entry 由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系. Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也 ...
- ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
参考来源:https://blog.csdn.net/yuxinha11/article/details/80090197 ENGINE=InnoDB不是默认就是这个引擎吗?——是的,如果不写也是ok ...
- 有十个div,怎样实现选中其中一个,改变其背景色,另外九个不变,当选中另一个时又改变另一个的背景色
这个是jq写的,可以自己下载一个js库,配上这个就可以了,里面的div可以用class控制,比如你10个div class为a1 也就是<div class="a1"> ...
- sping data jpa 共享主键 OneTonOne 延时加载
当我们使用spring boot创建项目时,系统默认使用的是如下parent. <parent> <groupId>org.springframework.boot</g ...
- j网络爬虫之WebMagic
WebMagic官网:http://webmagic.io/ 注意: 1.在自定义PageProcessor中使用System.out.println(“str”),Spider.create(new ...
- Css网页样式设计
第一章 概述 一.CSS简介1.CSS是Cascading Style Sheets(层叠样式表单)的简称.通常所称的CSS是指CSS1,即层叠样式表单1级. 2.编辑CSS文档:与编辑HTML的方法 ...
- vue中项目如何引入sass (vue-cli项目)
1.进入项目目录 2.安装sass的依赖 npm install --save-dev sass-loader npm install --save-dev node-sass 3.在build文件夹 ...
- Nginx的端口修改问题
转自:https://www.cnblogs.com/fengyuhuawu/p/7867728.html 修改 nginx.conf 文件实现. 在 Linux 上该文件的路径为 /usr/loca ...
- 035-OpenStack 关闭安全组
OpenStack Neutron的安全组默认会对每个网口开启MAC/IP过滤功能(防arp欺骗),不是该网口的MAC/IP发出的包会被宿主机丢弃.这种限制会导致vNF的上行网口转发的数据包被丢弃,无 ...
- VB.net删除节点,数据库,文件
Private Sub mnuDel_Click()'删除节点Dim sKey As String'Dim sFile As StringDim oFS As FileSystemObjectDim ...