我想在DataGridView编辑时显示如下图控件:
(1)创建一个自定义组件UserControl,并继承IDataGridViewEditingControl接口(用意:在DataGridView进入编辑状态时可以调用该控件),添加如下代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Text;using System.Windows.Forms;
namespace Class.baseSys.controlSys{
public partial class UserControl1 : UserControl, IDataGridViewEditingControl { int rowIndex; DataGridView dataGridView; private bool valueChanged = false;
public UserControl1() { InitializeComponent(); }
/// <summary> /// 更改控件的用户界面 (UI),使之与指定单元格样式一致。 /// </summary> /// <param name="dataGridViewCellStyle">要用作用户界面的模型的 System.Windows.Forms.DataGridViewCellStyle。</param> public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; this.textBox1.ForeColor = dataGridViewCellStyle.ForeColor; this.textBox1.BackColor = dataGridViewCellStyle.BackColor; }
/// <summary> /// 确定指定的键是应由编辑控件处理的常规输入键,还是应由 System.Windows.Forms.DataGridView 处理的特殊键。 /// </summary> /// <param name="key">一个 System.Windows.Forms.Keys,表示按下的键。</param> /// <param name="dataGridViewWantsInputKey">当 System.Windows.Forms.DataGridView 要处理 keyData 中的 System.Windows.Forms.Keys时,则为 true;否则为 false。</param> /// <returns>如果指定的键是应由编辑控件处理的常规输入键,则为 true;否则为 false。</returns> 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; } }
/// <summary> /// 检索单元格的格式化值。 /// </summary> /// <param name="context">System.Windows.Forms.DataGridViewDataErrorContexts 值的按位组合,它指定需要数据的上下文。</param> /// <returns>一个 System.Object,表示单元格内容的格式化版本。</returns> public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; }
/// <summary> /// 准备当前选中的单元格以进行编辑。 /// </summary> /// <param name="selectAll">为 true,则选择单元格的全部内容;否则为 false。</param> public void PrepareEditingControlForEdit(bool selectAll) { }
/// <summary> /// 获取或设置包含单元格的 System.Windows.Forms.DataGridView。 /// </summary> public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } }
/// <summary> /// 实现接口 IDataGridViewEditingControl.EditingControlFormattedValue /// </summary> public object EditingControlFormattedValue { get { return this.textBox1.Text;} set { this.textBox1.Text = value.ToString(); } }
/// <summary> /// 增加属性设置TextBox的值 /// </summary> public String tetText { get { return this.textBox1.Text; } set { this.textBox1.Text = value.ToString(); } }
/// <summary> /// 获取或设置该承载单元格的父行的索引。包含该单元格的行的索引,如果没有父行,则为 -1。 /// </summary> public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } }
/// <summary> /// 获取或设置一个值,该值指示编辑控件的值是否与承载单元格的值不同。 /// </summary> public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } }
/// <summary> /// 获取当鼠标指针位于 System.Windows.Forms.DataGridView.EditingPanel 上方但不位于编辑控件上方时所使用的光标。 /// </summary> public Cursor EditingPanelCursor { get { return base.Cursor; } }
/// <summary> /// 获取或设置一个值,该值指示每当值更改时,是否需要重新定位单元格的内容。 /// </summary> public bool RepositionEditingControlOnValueChange { get { return false; } }
/// <summary> /// 修改TextBox值时通知datagridviewCell. /// </summary> /// <param name="eventargs"></param> private void textBox1_TextChanged(object sender, EventArgs e) {
//DataGridView中Cell的Changed事件 valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); }
}}
(2)增加控新地DataGridViewCell控件,使期在编辑时调用自定义组件
using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;
namespace Class.baseSys.controlSys{ /// <summary> /// 选择输入控件 /// </summary> public class CalendarColumn : DataGridViewColumn { public CalendarColumn() : base(new CalendarCell()) { } /// <summary> /// 获取或设置用于创建新单元格的模板。 /// </summary> public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { //确认单元格使用了自定义的日期单元格模版 if (value != null && !value.GetType().IsAssignableFrom(typeof(TetInputCell))) { throw new InvalidCastException(/*Class.Properties.Resources.Message*/); } base.CellTemplate = value; } } } /// <summary> /// 日期单元格 /// </summary> public class TetInputCell : DataGridViewTextBoxCell { public TetInputCell() : base() { // 默认为短日期型 //this.Style.Format = "c"; } /// <summary> /// 初始化用于编辑单元格的控件。 /// </summary> /// <param name="rowIndex">单元格所在位置的从零开始的行索引。</param> /// <param name="initialFormattedValue">它表示在开始编辑时单元格显示的值。</param> /// <param name="dataGridViewCellStyle">表示单元格样式的 System.Windows.Forms.DataGridViewCellStyle。</param> public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { //初始化之后设置编辑状态的值 base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
UserControl1 ctl = (UserControl1)DataGridView.EditingControl; //Value = "111"; if (Value != null && Value != System.DBNull.Value) ctl.tetText = this.Value.ToString(); } /// <summary> /// 获取单元格的寄宿编辑控件的类型。 /// </summary> public override Type EditType { get { return typeof(UserControl1); } } /// <summary> /// 获取或设置单元格中值的数据类型。 /// </summary> public override Type ValueType { get { return typeof(String); } } /// <summary> /// 获取新记录所在行中单元格的默认值。 /// </summary> public override object DefaultNewRowValue { get { return ""; } } }
}
(3)程序调用
CustormerDgv dgView = null;