转自:http://blog.csdn.net/lulu831110/archive/2009/11/04/4767559.aspx
之前介绍的使得datagrid 能够进行编辑的实现方法:利用一个隐藏的textbox控件,当用户点击datagrid单元格变化引发事件CurrentCellChanged发生,在该事件中设置textbox可见,且显示信息即为当前选中的单元格的文本,当修改文本信息焦点离开textbox时,将textbox中的内容写入datagrid绑定的datatable中,这样就实现利用一个覆盖在单元格上的可编辑的textbox使得datagrid可编辑的功能。
但是它存在一个问题:当移动DataGrid的滚动条时,textbox仍在原来的位置,没有失去焦点。
如上图所示,要解决这个问题,就需要能够捕捉到datagrid的拖动滚动条事件。
查资料后发现,原来Datagrid控件是由三个控件组成,这些控件可以利用DataGrid.controls属性获得,利用DataGrid.controls.count可以获得控件的个数。
那么就可以按照DataGrid.controls[i]用i下标来访问每一个控件。
通过编程测试找到
DataGrid.controls[0]对应的是水平滚动条
DataGrid.controls[1]对应的是垂直滚动条
DataGrid.controls[2]对应的是显示单元格
因此我们可以针对水平滚动条,自己编写事件触发过程:
//水平滚动条滚动事件
((HScrollBar)YingYangGrid.Controls[0]).ValueChanged+=newEventHandle(YuanLiaoYiYgForm_ValueChanged);
//响应函数
void YuanLiaoYiYgForm_ValueChanged(object sender, EventArgs e)
{
//如果textbox获得焦点,则让它不可见,这样同时会促发LostFocus事件,引发数据更新
if (_cellEditBase.Focused)
{
_cellEditBase.Visible = false;
}
}
这样就实现了当点击datagrid的滚动条时让textbox失去焦点。
同样的道理可以对DataGrid的垂直滚动条进行同样的操作。