Sui*_*pps 6 c# mysql data-binding datagridview
我有一个场景,我有多个用户(一次约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;
Run Code Online (Sandbox Code Playgroud)
但是,当另一个用户进行更改时,这不会更新本地DataGridView以反映更改.在搜索网页后,我尝试将该VirtualMode属性设置为true.仍然没有运气.
接下来,我创建了一个计时器,它将每秒拨打一次可以调用的计时器
dataGridView1.Refresh();
Run Code Online (Sandbox Code Playgroud)
但是,当另一个用户更新数据库时,更改将不会反映在本地DGV上.我找到了另一篇建议尝试的文章
bindingSource1.ResetBinding(false);
Run Code Online (Sandbox Code Playgroud)
我把它放在我的计时器上滴答功能,仍然没有更新.
我在MDSN上发现了一篇文章,建议我尝试mydtadp.Fill(table);在timer函数中再次调用该函数.一样.
我唯一可以工作的是保存当前所选行的索引,然后完全重新加载数据集,然后重新选择该索引.然而,这似乎很笨重,必须有一个更好的方法来做到这一点.这种方法似乎是不好的做法,并且只要定时器滴答时DGV就会闪烁,当用户移动光标时,数据网格视图需要花费几秒钟才能赶上用户.当用户对行进行更改时,每次击键都需要一个完整的计时器来更新.
我不建议您每次都完全更新 DGV,因为这会带来性能问题。
您可以将 DateTime 列添加到 MySQL 表中,当数据库表更新时,您只需将当前的 DateTime 放入其中即可。在您的 WinForms 应用程序中,您还添加一个变量来保留上次查询的日期时间。
然后,当计时器计时时,您只需选择自 DateTime 变量以来更新的那些行。
System.Data.DataView最后,您使用 SQL 查询中的新数据单独更新 DGV.DataSource 的相应行(我相信是)。