Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果数据库表更新/插入,如何使windows C#控件自动更新?_C#_Mysql_Winforms_Data Binding - Fatal编程技术网

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

如果数据库表更新/插入,如何使windows C#控件自动更新?,c#,mysql,winforms,data-binding,C#,Mysql,Winforms,Data Binding,我有一个listView WinForms-C,我已经绑定到一个数据库(MySQL)表,但我似乎不知道如何让listView在更改数据库表(更新/插入)时自动显示结果,而用户不必触发事件,例如按钮单击、计时器滴答声等 谁能给我指一下正确的方向吗。如有任何建议/解决方案,将不胜感激 谢谢, -Donald您的数据源上应该有一个事件,在发生更新时触发该事件。您可能会附加到该事件,并让它在没有用户干预的情况下触发刷新——尽管您可能需要使用委托来更新UI,因为它是从事件触发器触发的 为了清楚起见,我知道

我有一个listView WinForms-C,我已经绑定到一个数据库(MySQL)表,但我似乎不知道如何让listView在更改数据库表(更新/插入)时自动显示结果,而用户不必触发事件,例如按钮单击、计时器滴答声等

谁能给我指一下正确的方向吗。如有任何建议/解决方案,将不胜感激

谢谢,
-Donald

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

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

编辑版本2

我建议创建一个计时器,正如上面Pieter所建议的那样,并轮询数据库中的更改。使用数据库中的某些值作为计数器,以了解何时需要从中获取更新(即,如果表中有主键,请根据
WHERE key>last\u key\u received

此外,由于您将在另一个线程中工作,因此需要创建一个安全更新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);
    }
}

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

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

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

  • 检测更改的简单方法是定期执行查询(比如每分钟或每5分钟),并检测对数据库的更改

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


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

    您是否希望MySQL DB在其结构发生变化时向您的代码发送事件/触发器?是否由应用程序进行了更改?如果没有,应用程序如何知道发生了更改?好的,让我确保我清楚这一点。你们是说我应该创建一个事件,在表发生更改时触发,并通知winForm?你能给我一个例子说明你在说什么吗?或者,如果你知道任何链接,包括我正在寻找的。这是正确的。在不知道您要将控件绑定到什么的情况下,我可能会对假设源代码中有某种表示后端更改的信息抱有很大的信心。在同样的前提下,这是假设用户正在做的事情触发了强制更新(即,不是休眠客户端获取了初始数据库信息,然后另一个用户在某处进行了更改,您希望客户端能够识别更改)。如果后者是真的,那么最好的办法可能是定期轮询数据库以进行更改,并根据需要进行更新。我将clearify-我将实时数据插入到数据库表中,如果表插入符合特定条件,我希望显示表插入的结果,但是我想让用户不必点击按钮就可以自动将结果显示给eh listview。我明白,但是这是否包含在处理程序中?是否有您正在使用的库,或者使用SqlClient直接调用并将数据推送到您自己的库中?有很多方法可以查询MySQL并将值推送到控件中。另外,我需要理解你所说的希望它在更改时更新的意思(用户所做的更改,与应用程序分离的另一个用户所做的更改,等等)