【问题标题】:c# datagridview autorefresh in LAN时间:2019-05-10 标签:c#datagridviewautorefresh in LAN
【发布时间】:2014-11-05 02:09:58
【问题描述】:

我是 C# 的初学者,遇到了一个大问题。 前面带有 datagridview 的应用程序(一个工作日的终端计划)可以在 LAN 中的许多 PC 上使用 MS Windows Server 和 MySQL 数据库。 如何在所有其他 PC 上自动更改一个工作站上所做的更改,而不对其进行任何操作(仅启动应用程序)。 我有一个数据和 datagridview 刷新程序,我必须只知道何时必须启动此程序,这意味着我必须知道任何其他工作站何时进行了任何更改。 感谢您的帮助!

【问题讨论】:

    标签: c# mysql datagridview refresh lan


    【解决方案1】:

    一个简单的解决方案是使用一个计时器,当它过去时你刷新你的gridview。等在定义的时间段内,它将自动刷新。问题可能是,如果您经常更新,则访问数据库会过载。为了防止这种情况,您可以创建一个处理所有数据的服务器应用程序

    假设 PC 1 正在启动客户端应用程序。

    1. 首先它连接到服务器应用程序(服务器存储客户端的引用,例如在列表中)。

    2. PC1 上的用户进行更改并单击保存后,软件会将更改发送到服务器(例如,包含所有需要信息的自定义对象)。

    3. 服务器将更改保存到数据库

    4. 服务器应用程序是否有效响应特定客户端

    5. 如果有效,则向所有客户端发送一个自定义对象(例如名为 ChangesDoneEvent),表明更改已完成。

      1. 所有连接的客户端都将收到该对象,并且现在知道必须刷新其网格视图。

    如需更多信息,请搜索 C# 多线程服务器套接字编程。对于通过网络发送自定义对象,您也会在互联网上找到许多资源,也许这会对您有所帮助Sending and receiving custom objects using Tcpclient class in C#

    【讨论】:

    • 在 c# 中是否也有可能制作广播消息 - 所以如果一台 PC 制作了什么 - 另一台电脑会自动知道。
    • 也许你可以利用一些库。我认为使用该库您可以处理所有您想做的事情:networkcomms.net。为了进行更改,您可能应该使用 TCP。对于已进行更改的广播,您可以对网络使用 UDP 广播(如果所有电脑都在同一个子网中,这是最简单和最快的方式。但消息可能会丢失。所以如果数据包丢失,一个客户端可能不会更新)。或者,您可以将所有连接的客户端保存在一个列表中,并向它们发送一个对象,如答案中所述。
    【解决方案2】:

    上面提供的解决方案实际上是处理这种情况的好方法。在实施之前,您可能还想考虑潜在的回退。由于您使用的是套接字,因此 Client PC 的 IP 可能会更改。添加到列表中的对象引用可能是错误状态。您可能想考虑处理这个陷阱。

    【讨论】:

      【解决方案3】:

      在你的表单上声明代理

      public delegate void autocheck();
      private System.Timers.Timer TTTimer = new System.Timers.Timer();
      
      public void autofilldgv()
      {
          if (this.InvokeRequired)
          {
            this.Invoke(new autocheck(UpdateControls));
          }
          else
          {
            UpdateControls();
          }
      }
      private void UpdateControls()
      {
         //call your method here
        filldgv();
      
      }
      void TTTimer_Elapsed(object sender System.Timers.ElapsedEventArgs e)
      {
        mymethod();
      }
      public void mymethod()
      {
        //this method is executed by the background worker
        autofilldgv();
      }
      private void frm_receptionView_Load(object sender, EventArgs e)
      {
        this.TTTimer.Interval = 1000; //1 sec interval
        this.TTTimer.Elapsed += new System.Timers.ElapsedEventHandler(TTTimer_Elapsed);
        this.TTTimer.Start();
      }
      

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 2020-10-01
        • 2015-06-14
        • 2011-07-08
        • 2012-02-03
        • 2017-04-15
        • 2021-07-31
        • 2016-01-27
        • 1970-01-01
        相关资源
        最近更新 更多