做个项目需要用到DataGridView,这个控件还是挺好用的,但是今天却发现无法实现自己想要的功能。主要是DataGridViewCheckBoxColumn这个列虽然是提供了复选框,但是却未能在复选框的旁边提供文本的显示。在网上搜索了一下,提供的方法很多都是弄两列,然后合并单元格,将两列合并成为了一列。不过我不太喜欢那种方式,于是就自己重写了一下DataGridViewColumn,略显简陋,只实现了最基本的功能,现在拿出来,希望各位能够提一些好的意见和见解。

首先定义一个实现了 IDataGridViewEditingControl 接口的类

  class DataGridViewCheckBoxTextControl : CheckBox, IDataGridViewEditingControl
{
/// <summary>
/// 当前所在表格
/// </summary>
private DataGridView MyDataGridView { set; get; }
/// <summary>
/// 值是否发生更改
/// </summary>
private bool ValueChanged { set; get; }
/// <summary>
/// 当前所在行
/// </summary>
private int RowIndex { set; get; } protected override void OnCheckedChanged(EventArgs e)
{
ValueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnCheckedChanged(e);
} public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
Font = dataGridViewCellStyle.Font;
ForeColor = dataGridViewCellStyle.ForeColor;
BackColor = dataGridViewCellStyle.BackColor;
} public DataGridView EditingControlDataGridView
{
get
{
return MyDataGridView;
}
set
{
MyDataGridView = value;
}
} public object EditingControlFormattedValue
{
get
{
return GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
}
set
{
Checked = value == null ? false : (bool)value;
}
} public int EditingControlRowIndex
{
get
{
return RowIndex;
}
set
{
RowIndex = value;
}
} public bool EditingControlValueChanged
{
get
{
return ValueChanged;
}
set
{
ValueChanged = value;
}
} public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch (keyData & Keys.KeyCode)
{
case Keys.LButton:
return !dataGridViewWantsInputKey;
}
return !dataGridViewWantsInputKey;
} public Cursor EditingPanelCursor
{
get { return Cursors.Default; }
} public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.Checked;
} public void PrepareEditingControlForEdit(bool selectAll)
{ } public bool RepositionEditingControlOnValueChange
{
get { return false; }
}
}

其次定义重写这个列所需要的单元格

   public class DataGridViewCheckBoxTextCell : DataGridViewCell
{
public DataGridViewCheckBoxTextCell() : base() { } private static Type defaultEditType = typeof(DataGridViewCheckBoxTextControl);
private static Type defaultValueType = typeof(System.Boolean); public override Type EditType
{
get { return defaultEditType; }
} /// <summary>
/// 单元格边框颜色
/// </summary>
private Color CellBorderColor { get { return Color.FromArgb(, , ); } } protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
var check = (Boolean)value;
if (paintParts == DataGridViewPaintParts.Background || paintParts == DataGridViewPaintParts.All)
{
graphics.FillRectangle(new SolidBrush(cellStyle.BackColor), cellBounds);
}
if (paintParts == DataGridViewPaintParts.Border || paintParts == DataGridViewPaintParts.All)
{
graphics.DrawRectangle(new Pen(CellBorderColor), cellBounds);
}
if (paintParts == DataGridViewPaintParts.SelectionBackground || Selected)
{
graphics.FillRectangle(new SolidBrush(cellStyle.SelectionBackColor), cellBounds);
}
var col = OwningColumn as DataGridViewCheckBoxTextColumn;
if (col != null && !string.IsNullOrEmpty(col.Text))
{
graphics.DrawString(col.Text, cellStyle.Font, new SolidBrush(Selected ?
cellStyle.SelectionForeColor : cellStyle.ForeColor),
new Point(cellBounds.X + , cellBounds.Y + cellBounds.Height / ));
}
CheckBoxRenderer.DrawCheckBox(graphics, new Point(cellBounds.X + , cellBounds.Y + cellBounds.Height / ), CheckState);
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
} /// <summary>
/// <summary>
/// 当前复选框的状态
/// </summary>
private CheckBoxState CheckState { set; get; } protected override void OnMouseDown(DataGridViewCellMouseEventArgs e)
{
var check = (bool)Value;
CheckState = check ? CheckBoxState.CheckedPressed : CheckBoxState.UncheckedPressed;
base.OnMouseDown(e);
} protected override void OnMouseUp(DataGridViewCellMouseEventArgs e)
{
var check = (bool)Value;
Value = !check;
SetValue(RowIndex, Value);
CheckState = check ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
base.OnMouseUp(e);
} public override Type ValueType
{
get
{
Type valueType = base.ValueType;
if (valueType != null)
{
return valueType;
}
return defaultValueType;
}
} public override object DefaultNewRowValue
{
get
{
return true;
}
}
}

最后才需要再定义这个新建的列

    public class DataGridViewCheckBoxTextColumn : DataGridViewColumn
{
public DataGridViewCheckBoxTextColumn()
: base()
{
CellTemplate = new DataGridViewCheckBoxTextCell();
} public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(DataGridViewCheckBoxTextCell)))
{
throw new Exception("这个列里面必须绑定MyDataGridViewCheckBoxCell");
}
base.CellTemplate = value;
}
} public override object Clone()
{
DataGridViewCheckBoxTextColumn col = (DataGridViewCheckBoxTextColumn)base.Clone();
col.Text = Text;
return col;
} public string Text { set; get; } }

如果这个列是定义在控件类库内,那么引用到项目里面的时候,就能够直接在编辑器内添加这个列。如图:

最终效果图:

重写DataGridViewColumn的更多相关文章

  1. C#如何自定义DataGridViewColumn来显示TreeView

    我们可以自定义DataGridView的DataGridViewColumn来实现自定义的列,下面介绍一下如何通过扩展DataGridViewColumn来实现一个TreeViewColumn 1 T ...

  2. 怎么自定义DataGridViewColumn(日期列,C#)

    参考:https://msdn.microsoft.com/en-us/library/7tas5c80.aspx 未解决的问题:如果日期要设置为null,怎么办? DataGridView控件提供了 ...

  3. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  4. category中重写方法?

    问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便 ...

  5. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写

    主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...

  6. 小丁带你走进git的世界四-重写历史记录

    一.git对象文件创建 开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库 ...

  7. 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

    文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html 系列目录 前言: 导入导出实在多例子,很多成熟的组建都分装了 ...

  8. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  9. SQL Server索引视图以(物化视图)及索引视图与查询重写

    本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...

随机推荐

  1. SQL Server 表和索引存储结构

    在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...

  2. eclipse[downloads]

    下载J2EE:http://www.eclipse.org/downloads/ 下载WPT插件:http://download.eclipse.org/webtools/updates 下载TOMC ...

  3. 1.4.2 solr字段类型--(1.4.2.5)使用枚举字段

    1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...

  4. Override Inline Styles with CSS

    inline style: <div style="background: red;"> The inline styles for this div should m ...

  5. 3. Android框架和工具之 xUtils(HttpUtils)

    1. HttpUtils 作用: 支持同步,异步方式的请求: 支持大文件上传,上传大文件不会oom: 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD请求: 下载支持301/3 ...

  6. 【Linux/Ubuntu学习2】ubuntu-ubuntu10.04使用wine安装SourceInsight

    1. 环境:ubuntu10.04 2. 安装 wine 关于 wine ,请参考这里.通过网络安装: $ sudo apt-get install wine 3. 安装 SourceInsight ...

  7. 【Mood-6】空气显示触摸屏、智能钱夹

    空气显示触摸屏 这款屏幕借助从设备中送出的空气和水在空中形成投影,可以用来展示计算机或平板中的图像.此外,它还可以实现人机互动.你只需在虚拟屏幕前挥动双手,就能完成一系列的隔空操作,如滑动.捏合.缩放 ...

  8. C#中常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度   常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...

  9. 51nod 第K大区间2(二分+树状数组)

    题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...

  10. JavaWeb 学习的第一阶段总结

    本人从事Asp.net开发三年,结合市场情况,综合考虑后决心转向JavaWeb方向.于是开始了自学Java的历程. 首先,我用马士兵的Java基础教学视频,快速地学习了一遍Java基础.因为有C#基础 ...