公告:QQ群:124766907,若你是在.NET领域有独到见解,并有深厚的编程功力,在某一领域具有专长,欢迎本您入群,本群已经有好几位MVP,在SL,.NET,BS方面具有造诣的人欢迎进群。无4年以上经验者勿加,本群追寻高端顶级,多谢。
由于子窗体进行了数据更改,保存,需要刷新父窗体BODY里DataGridView里的数据,因此,当BODY里的数据量比较大,而你刚好是选的是当前行比较靠后,又要刷新父窗体的时候,可能默认就数据定位到第一行了。也许你以前是用的是dataGridView.CurrentRow.Index进行记录,然后FirstDisplayedScrollingRowIndex里进行值更改,让后再使用FirstDisplayedScrollingRowIndex进行行确定行的位置,然后可能使用到FirstDisplayCell属性进行当前光标的定位。
现在可以直接使用DATAGRIDVIEW的HitTestInfo方法,获取当前鼠标定位到的行列索引,HitTestInfo自己就包含了行列索引,或者包含了当前鼠标在屏幕中的X,Y坐标,可以根据这些属性进行再定位。
/// <summary>
/// 鼠标点击的时候就获取当前的HitTestInfo信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
// hittest全局变量DataGridView.HitTestInfo hittest;
hittest = dataGridView1.HitTest(e.X, e.Y);
//MessageBox.Show(hittest.ToString());
this.dataGridView1.Rows[hittest.RowIndex].Selected = true;
}
//测试重新定位。
private void button1_Click(object sender, EventArgs e)
{
if (hittest != null)
{
dataGridView1.FirstDisplayedScrollingRowIndex = hittest.RowIndex;
}
else
{
dataGridView1.FirstDisplayedScrollingRowIndex = 0;
}
}
而也可以直接定义全局变量,获取行索引,然后定位到第一个单元格就OK了
dgvDetails.CurrentCell =
dgvDetails.Rows[currentBodyDetailRowIndexSelected].Cells[0];//再重新定位到当前行
dgvDetails.FirstDisplayedScrollingRowIndex
= currentBodyDetailRowIndexSelected;
dgvDetails.FirstDisplayedCell =
dgvDetails.Rows[currentBodyDetailRowIndexSelected].Cells[0];