思路:
1.记住之前的行号
优点:效率高
缺点:如果增删操作后调用的刷新代码,选中的会是相邻的(不过有特殊业务需求,如删除之后选相邻,增加之后选新增),根据需求和操作相应更改行号,应该还是能完美解决的。
2.记ID
优点:准确,不需要关心是什么操作。
缺点:需要遍历,效率会降低
3.记行号和ID
结合1和2的解决方案,先判断刷新后,处于当前行号的ID是否一致,一致就选中,否则就去遍历。
优缺点:中规中矩,还是值得推荐的。不用关心是什么操作。
4.记ID,获取数据源时获取相应行号,行号自然对应数据容器内的行号(是在获取sql中得到行号,还是特意写个获取行号的ID,根据项目实际自择即可。)
优缺点:根据需求选择,也是不错的选择。对于复杂条件多的查询语句不推荐
这里只贴上第三种的Demo
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//整行选中
public string selRowInfo = string.Empty;//
定义一个属性来存储选中信息 【行号,ID】
public int pageRowFirst = -1;//显示第一行的行号
//在单击cell属性中赋值
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e){//获取ID和行号int rownum = e.RowIndex;string strID = dataGridView1.Rows[e.RowIndex].Cells["编号"].Value.ToString ();selRowInfo = string.Format("{0},{1}", rownum, strID);//赋值pageRowFirst = dataGridView1.FirstDisplayedScrollingRowIndex;//获取第一行的行号}
//注意在增删变化中,需求的变化,如增加之后刷新后可能要选中增加的行。删除之后可能设置临近或者第一个。如果增加后选中原来选中,我们的代码不需要更改。
//
selRowInfo =
selRowInfo.Split(',')[0]
;//
或者删除后设置临近的选中,
在
删除代码中添加
//
selRowInfo =
""
;//
或者删除后设置第一个,
在
删除代码中添加
//
selRowInfo =
selRowInfo.Split(',')[0]+“,”+新增ID
;//
增加之后刷新后可能要选中增加的行
,在增加代码中添加
//在刷新或loadData()代码中最后加上代码:
#region 刷新后回复原来的位置if (!string.IsNullOrEmpty(selRowInfo))//如果为""或者null就默认,其他情况处理{if (!selRowInfo.Contains(","))//只有行号,直接选中行即可{dataGridView1.Rows[Convert.ToInt32(selRowInfo)].Selected = true;dataGridView1.FirstDisplayedScrollingRowIndex = Convert.ToInt32(pageRowFirst); //设置可见}else{string rownum = selRowInfo.Split(',')[0];string rowID = selRowInfo.Split(',')[1];if (dataGridView1.Rows[Convert.ToInt32(rownum)].Cells["编号"].Value.ToString() == rowID){dataGridView1.Rows[Convert.ToInt32(rownum)].Selected = true;dataGridView1.FirstDisplayedScrollingRowIndex = Convert.ToInt32(pageRowFirst); //设置可见}else{for (int i = 0; i < dataGridView1.Rows.Count; i++){if (dataGridView1.Rows[i].Cells["编号"].Value.ToString() == rowID){dataGridView1.Rows[i].Selected = true;dataGridView1.FirstDisplayedScrollingRowIndex =Convert .ToInt32 ( pageRowFirst); //设置可见break;}}}
}}#endregion