使用数据库按计时器更改更新Datatable和DatagridView

时间:2010-05-01 09:09:37

标签: c#

场景:我有一个数据库表,某些服务经常更新。

我有一个#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 ....

的选择

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

在更新数据网格之前,您需要存储您感兴趣的所有当前选择,然后在新数据绑定完成后恢复它们。

CurrentRow,您可以从BindingContext获取。例如

int lastRow = BindingContext[dsProva.Tables["table"]].Position;

然后在重新绑定DGV后恢复当前行

BindingContext[dsProva.Tables["table"]].Position = lastRow

当然,这只会确保当前行指向同一行索引,如果数据已经足够改变,则可能与以前的数据行不同。

如果要选择相同的行数据,可以使用行的键并循环访问数据,一旦找到与上一个选择匹配的行的索引,就可以设置绑定上下文到那个指数。