1.功能描述:
通过重写DataGridViewColumn,DataGridViewTextBoxCell,并在重写的 DataGridViewTextBoxCell 注册一个dgvtbec_KeyUp事件实现其功能
2.具体代码如下
a. /// <summary> /// 自定义DataGridView中的列 /// </summary> public class SpecialDataGridViewColumn : DataGridViewColumn { //给UI层注册使用的事件 public event KeyEventHandler DataGridViewColumnKeyUp; public SpecialDataGridViewColumn() : base() { this.CellTemplate = new SpecialDataGridViewCell(); } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { if (value != null && !value.GetType().IsAssignableFrom(typeof(SpecialDataGridViewCell))) { throw new Exception("column must Bind type for SpecialDataGridViewCell"); } base.CellTemplate = value; } }
private string m_dataGridViewColumnTextValue = "";
public string DataGridViewColumnTextValue { get { return m_dataGridViewColumnTextValue; } set { m_dataGridViewColumnTextValue = value; } }
public void SpecialDataGridViewColumn_DataGridViewColumnKeyUp(object sender, KeyEventArgs e) {
if (DataGridViewColumnKeyUp != null) { DataGridViewColumnKeyUp(this, e); } } }
b. /// <summary> /// 自定义单元格的可编辑文本 /// </summary> public class SpecialDataGridViewCell : DataGridViewTextBoxCell { public override Type EditType { get { return typeof(DataGridViewTextBoxEditingControl); } }
public SpecialDataGridViewCell() : base() { } private DataGridViewTextBoxEditingControl dgvtbec; private DataGridViewColumn dgvc; private SpecialDataGridViewColumn mdgvc;
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); dgvtbec = DataGridView.EditingControl as DataGridViewTextBoxEditingControl; dgvc = this.OwningColumn; if (dgvc is SpecialDataGridViewColumn) { mdgvc = dgvc as SpecialDataGridViewColumn; dgvtbec.KeyUp += new KeyEventHandler(dgvtbec_KeyUp); } } /// <summary> /// 功能:焦点不用移到别的单元格里 /// (即我们不再依赖dataGridView1_CellBeginEdit或者是dataGridView1_CellValueChanged) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void dgvtbec_KeyUp(object sender, KeyEventArgs e) { mdgvc.DataGridViewColumnTextValue = dgvtbec.Text; mdgvc.SpecialDataGridViewColumn_DataGridViewColumnKeyUp(sender, e); }
}