目前,Winform中的DataGridView中的数据需要实时刷新,刷新方式为重新加载数据源。
但存在的问题是,假如数据行数,列数都超出屏幕,当用户在浏览屏幕外数据的时候(在浏览n行n列的数据),刷新数据,会导致回到0行0列,假如刷新的频率过快,n行的数据很难操作,n列的数据很难看到。
不知道有什么好的方法,能够在刷新之后,还是保持在用户操作的区域,给用户的感官是除了数据的变更之外,没有其它变化。
望大神能给点意见,或简单实现方式。
在此,先谢谢了!
10
10
5
10
20
原因是你刷新取出来的ds.Table[0] 已经不是加载设的那个DataSource了 对象不是同一个
建议不要直接用Table当数据源
而是本人封装一个类当数据源
刷新的时候比较新老数据 ,只有不同的地方才Invalidate 减少界面重画操作
30
原因是你刷新取出来的ds.Table[0] 已经不是加载设的那个DataSource了 对象不是同一个
建议不要直接用Table当数据源
而是本人封装一个类当数据源
刷新的时候比较新老数据 ,只有不同的地方才Invalidate 减少界面重画操作整得有点迷糊了,感觉应该可以,但是就是不刷新。帮本人看看更新部分代码吧。
其中conlistold和conlistnew为对象集合
DataGridView的数据源为conlistold//******************************************* conlistnew = fub.GetConMEntity(); //获取新的数据 for (int m = 0; m < conlistold.Count; m++) { if (conlistold[m].Con_id == conlistnew[m].Con_id) //主键相等 { if (conlistold[m].Lightstate != conlistnew[m].Lightstate) //更新部分不等向下执行 { for (int i = 0; i < dataGridView1.Rows.Count; i++) { int ic = Convert.ToInt32(dataGridView1.Rows[i].Cells["con_id"]); if (conlistold[m].Con_id == ic) //确认主键 { conlistold[m] = conlistnew[m]; //数据更新 ? dataGridView1.InvalidateRow(i); } } } } } conlistold = conlistnew; //更新数据? //********************************************
conlistold = conlistnew; //更新数据? 是不需要写的
其他地方看上去也没什么错误啊
你调试看看conlistold的数据能否正确更新了
conlistold[m] = conlistnew[m];是不是执行了并且数据改变了
20
conlistold = conlistnew; //更新数据? 是不需要写的
其他地方看上去也没什么错误啊
你调试看看conlistold的数据能否正确更新了
conlistold[m] = conlistnew[m];是不是执行了并且数据改变了嗯,int ic = Convert.ToInt32(dataGridView1.Rows[i].Cells[“con_id”]);少了点东西,所以异常了,本人捕捉异常那块没写东西,就没看到。
本人上面写的这段,是更新数据与显示数据 条目相等的,本人可以处理了。谢谢!
另外对于新增和删除,应该是怎么个处理方式?
删除,将DataGridView中对应的行删除,数据源中同样删除。
新增,DataGridView的处理是怎么个方式?
假如是新增和删除,可能就要通过Invalidate()重画整个DataGridView的客户区 原因是判断删除和插入的位置是比较麻烦的 尤其是还有排序的情况下,
这个最大的问题是假如频率很高 可能会造成界面闪烁