DataGridView等数据控件刷新后,选中刷新前的选中值

思路:
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


 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值