场景:我有一个数据库表,某些服务经常更新。
我有一个#Winforms应用程序,它通过将数据表绑定为数据源来在datagridview中加载此表,然后我想添加一个Timer,每10秒更新一次数据表的内容以及数据库表中的最后一次更改。 ..
我不需要使用数据表更改来更新数据库,但我需要使用数据库表中的最后一个更改来更新数据表,这是通常的反转....
有办法吗?什么是最好的方式?
我尝试过这段代码:
private void ServiceTimer_Tick(object state)
{
OdbcConnection oCon = new OdbcConnection();
oCon.ConnectionString = ConnectionStrings;
OdbcDataAdapter dp = new OdbcDataAdapter("SELECT * FROM table", oCon);
dsProva.Tables.Clear();
dp.Fill(dsProva,"table");
dataGridViewMessaggi.DataSource = dsProva.Tables["table"];
dataGridViewMessaggi.Refresh();
}
但每个Timer Tick我都丢失了DatagridView和Current Row ....
的选择有更好的解决方案吗?
答案 0 :(得分:0)
在更新数据网格之前,您需要存储您感兴趣的所有当前选择,然后在新数据绑定完成后恢复它们。
CurrentRow,您可以从BindingContext获取。例如
int lastRow = BindingContext[dsProva.Tables["table"]].Position;
然后在重新绑定DGV后恢复当前行
BindingContext[dsProva.Tables["table"]].Position = lastRow
当然,这只会确保当前行指向同一行索引,如果数据已经足够改变,则可能与以前的数据行不同。
如果要选择相同的行数据,可以使用行的键并循环访问数据,一旦找到与上一个选择匹配的行的索引,就可以设置绑定上下文到那个指数。