【问题标题】:How do I get a windows C# control to automatically update if the database table updates/inserts?如果数据库表更新/插入,如何让 Windows C# 控件自动更新?
【发布时间】:2011-05-13 22:30:27
【问题描述】:

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

谁能指出我正确的方向。任何建议/解决方案将不胜感激!

谢谢, -唐纳德​​

【问题讨论】:

  • 您是否希望 MySQL DB 在其结构发生变化时向您的代码发送事件/触发器?
  • 是应用做出的改变吗?如果没有,应用程序如何知道发生了变化?

标签: c# mysql winforms data-binding


【解决方案1】:

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

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

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

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

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

第一种机制会定期更新,就像旧的 POP3 通知一样。第二种机制将为您提供实时更新。

【讨论】:

    【解决方案2】:

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

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

    编辑第 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);
        }
    }
    

    【讨论】:

    • 好的,让我确定一下,你们是说我应该创建一个事件,当对表格进行更改时触发并通知 winForm?
    • 你能举个例子来说明你在说什么吗?或者如果您知道是否有任何链接涵盖了我正在寻找的内容。
    • 没错。在不知道您将控件绑定到什么的情况下,我可能会在假设源具有表明后端更改的信号方面做出了巨大的信心。在同样的前提下,这是假设用户正在做的事情正在触发强制更新(即,它不是获取初始数据库信息的休眠客户端,然后某个地方的另一个用户进行了更改,并且您希望客户端能够识别改变)。如果后者是真的,你最好的选择可能只是定期轮询数据库以获取更改并根据需要进行更新。
    • 我会清除 - 我有实时数据插入到数据库表中,如果符合特定条件,我想显示表插入的结果,但我想自动发生用户无需单击按钮即可将结果显示到 eh listView
    • 我明白,但这是否包含在处理程序中?是否有您正在使用的库,或者使用 SqlClient 并且只是直接调用并自己推送数据?有很多方法可以查询 MySQL 并将值推送到控件。另外,我需要通过说您希望它更新更改(用户所做的更改,与应用程序分开的另一个用户可能已经完成的更改等)来理解您的含义。
    猜你喜欢
    • 2018-02-19
    • 2019-11-02
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多