我有一种情况,我有多个用户(一次约50个)连接到一个表,这些用户都不断对已经存在的行进行更改。我需要做的是始终以某种方式始终显示数据库的实时 View 。

缓存表的副本不是一个有效的选择,因为所有用户都需要立即查看所有更改。

当我第一次加载数据库时

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以反射(reflect)更改。搜索完网络后,我尝试将VirtualMode属性设置为true。仍然没有运气。

接下来,我创建了一个计时器,它将每秒滴答一次,这将调用
dataGridView1.Refresh();

但是,当另一个用户更新数据库时,所做的更改将不会反射(reflect)在本地DGV上。我发现了另一篇建议尝试的文章
bindingSource1.ResetBinding(false);

我把它放在计时器上的刻度功能上,仍然没有更新。

我在MDSN上找到了一篇文章,建议我尝试在计时器函数中再次调用mydtadp.Fill(table);函数。一样。

我唯一可以做的就是保存当前选定行的索引,然后完全重新加载数据集,然后重新选择该索引。但是,这似乎很笨拙,必须有一种更好的方法来做到这一点。这种方法似乎是一种不好的做法,并且当计时器计时时,DGV不会很好地闪烁,并且当用户移动其光标时,datagridview需要花费几秒钟来 catch 用户。当用户对行进行更改时,每个击键都需要一个全时刻度来更新。

最佳答案

我不建议您每次都完全更新DGV,因为这会带来性能问题。

您可以将DateTime列添加到MySQL表中,并且在更新数据库表时,只需将当前的DateTime放入其中即可。在WinForms应用程序中,您还添加了一个变量,用于保留上一次查询的DateTime。

然后,当计时器计时时,您仅选择那些自DateTime变量以来已更新的行。

最后,您使用SQL查询中的新数据分别更新DGV.DataSource的相应行(我相信它是System.Data.DataView)。

关于C#DGV-显示实时MYSQL DB表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50654178/

10-10 06:03