转自: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的相应事件里没有关于滚动条的事件。
  • 考虑到滚动条移动,可能会导致paint事件,但是实践发现,DataGrid的滚动条操作,并没有引发paint事件(可能是因为滚动条滚动过程只是将本来已经画好的窗体挪过来,因为移动设备的屏幕很小,显示有限,它不是一个边画边更新的过程)。同样的道理,实验利用Form的Paint事件同样没有响应。
  • 然后考虑用mousedown事件,捕捉鼠标点击位置坐标,但是发现鼠标移动到滚动条后就不返回点击位置坐标了。
  • 综上考虑,如果想从DataGrid的事件中找到关于滚动条移动的事件不太可能,那我们是否可以获得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的垂直滚动条进行同样的操作。

 

posted on 2010-08-20 22:51  TsingCai  阅读(977)  评论(0编辑  收藏  举报