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);
}
}