如果数据库表更新/插入,如何让Windows C#控件自动更新?

我有一个listView WinForms-C#,我已经绑定到数据库(MySQL)表但我似乎无法弄清楚如何让listView在对数据库表进行更改时自动显示结果(更新/插入)没有用户必须触发事件,如button_click,timer_tick等…

有人可以指出我正确的方向。 任何建议/解决方案将不胜感激!

谢谢, – 唐纳德

SQL不支持将更改事件从数据库发送回客户端。

DataTable上的事件不会发出数据库更改的信号。 它们表示对DataTable本身的更改。

如果要查看对实际数据库的更改,您有两种选择:

  1. 检测更改的简单方法是定期执行查询,例如每分钟或每5分钟一次,并检测对数据库的更改;

  2. 如果您需要实时更改,则可以选择使用消息传递服务。 您可以实现在更改数据库时向其发送信号的WCF服务。 然后,其他进程(包括您自己的进程)可以使用回调接口连接到此WCF服务,并在发生这些更改时接收这些更改。 但是,只有在您完全控制对数据库的更改时,此方法才有效。

第一种机制将为您提供定期更新,例如旧POP3通知。 第二种机制将为您提供实时更新。

您的数据源应该有一个事件,当更新发生时触发该事件。 您可能会附加到该事件并在没有用户干预的情况下触发刷新 – 尽管您可能需要使用委托来更新UI,因为它是从事件触发器触发的。

为了清楚起见,我知道SQL没有办法标记更改,我的印象是他们有一个库来实现他们绑定的CRUD操作,并且有可用于标记所述更改的事件。 在下面的评论中,我现在可以做出更明智的决定

编辑版本2

我建议创建一个计时器,如上面建议的Pieter,并轮询数据库中的更改。 在数据库中使用一些值作为计数器,以了解何时需要从中获取更新(即,如果表中有主键,请继续检查WHERE key > last_key_receieved

此外,由于您将在另一个线程中工作,您将需要创建一个安全地更新UI的方法。 根据listView中有多少列,原型会有所不同,但前提是相同的:

 Timer updateScoresTimer = new Timer(); updateScoresTimer.Tick += delegate { // 1. grab the database info // 2. filter for post-worthy changes // 3. iterate over changes, passing the UI info to AddScore(...) }; updateScoresTimer.Interval = 30000; updateScoresTimer.Start(); public delegate void AddScoreHandler(String arg1, String arg2, String arg3); public void AddScore(String arg1, String arg2, String arg3) { if (this.listView1.InvokeRequired) this.BeginInvoke(new AddScoreHandler(this.AddScore), new object[]{ arg1, arg2, arg3 }); else { ListViewItem lvi = new ListViewItem(arg1); lvi.SubItems.AddRange(new string[]{ arg2, arg3 }); this.listView1.Items.Add(lvi); } }