我有一个场景,其中有多个用户(一次大约50个)连接到一个表,所有用户都不断地更改已经存在的行。我需要做的是总是显示数据库的实时视图。
拥有表的缓存副本不是一个有效的选择,因为所有用户都需要立即看到所有更改。
当我第一次加载我正在使用的数据库时
mydtadp = new MySqlDataAdapter();
bindingSource1 = new BindingSource();
table = new DataTable();
MySqlConnection MyConn = new MySqlConnection(MyConnection);
MyConn.Open();
mydtadp.SelectCommand = new MySqlCommand("SELECT * FROM `Appointments`", MyConn);
cmbl = new MySqlCommandBuilder(mydtadp);
mydtadp.Fill(table);
bindingSource1.DataSource = table;
dataGridView1.DataSource = bindingSource1;
但是,当其他用户进行更改时,这并不是更新本地datagridview以反映更改。搜索完网页后,我试着设置 VirtualMode
属性设置为true。还是不走运。
接下来,我创建了一个计时器,它每秒钟会滴答一次,然后调用
dataGridView1.Refresh();
不过,当另一个用户更新数据库时,更改不会反映在本地dgv上。我发现另一篇文章建议
bindingSource1.ResetBinding(false);
我把它放在定时器的滴答功能上,仍然没有更新。
我发现一篇关于mdsn的文章建议我试着给 mydtadp.Fill(table);
在定时器功能中再次运行。同样的事情。
我唯一能做的就是保存当前选定行的索引,然后完全重新加载数据集,然后重新选择该索引。然而,这似乎很笨拙,必须有一个更好的方法来做到这一点。这种方法看起来不太好,而且效果也不太好,每当计时器滴答作响时,dgv就会闪烁,当用户移动光标时,datagridview需要几秒钟才能赶上用户。当用户对一行进行更改时,每次击键都需要一个完整的计时器来更新。
1条答案
按热度按时间7fhtutme1#
我不建议您每次都完全更新dgv,因为这会带来性能问题。
您可以将datetime列添加到mysql表中,当数据库表更新时,只需将当前datetime放入其中。在winforms应用程序中,还添加了一个变量,用于保持上次查询的日期时间。
然后,当计时器滴答作响时,您只需选择自datetime变量以来更新的那些行。
最后,分别更新dgv.datasource的相应行(我相信是这样的)
System.Data.DataView
)使用来自sql查询的新数据。