【问题标题】:Sending data between forms without using .Show()在不使用 .Show() 的情况下在表单之间发送数据
【发布时间】:2011-02-23 08:50:42
【问题描述】:

假设我有 2 个表单。在 Form1 我有一个计时器,它计数 (count++),在 Form2 我有一个文本框 (textBox1),它显示计时器计数了多少。现在我想知道如何在没有任何用户干预(单击按钮)的情况下在“textBox1”中显示整数“count”,或者换句话说,如何使文本框中的数据自动刷新(不使用Form2 form = new Form2(); form.Show();) .我想要 2 个单独的窗口,一个是正在运行的计时器,另一个是一个文本框,显示计时器的计数并不断更新(我想是在计时器的帮助下)。

【问题讨论】:

    标签: c# forms refresh


    【解决方案1】:

    一种方法是创建一个公共事件并从另一种形式注册该事件。

    【讨论】:

      【解决方案2】:

      您可以有一个单例/静态类来保存与所有表单相关的所有数据,并作为属性公开。所有表单都可以写入和读取这些属性。此外,它会在属性更改时触发表单可以订阅的事件(以防您需要实时更新)。

      【讨论】:

      • 现在很多人都认为单例模式是一种反模式,所以我不建议使用它。
      【解决方案3】:

      最简单的方法:在 Form2 上公开一个公共属性。在属性的设置器中,设置文本框的值。我相信定时器事件在 UI 线程上触发,所以你不应该有任何线程安全问题。如果你这样做了,你将不得不回到上面 Brian 提到的公共事件方法。

      请记住,您可能还必须执行 DoEvents() 以使 UI 真正更新给用户。另请注意,这种更新本身会减慢您的应用程序的处理速度。

      public int TimerValue 
      {
      
          set
          {
              this.txtTextBox.Text = string.Format("{0:0000}", value);
      
          }
      }
      

      【讨论】:

        【解决方案4】:

        只需将您的计时器设为公共事件,以便在其他表单上引用它。

        【讨论】:

          【解决方案5】:

          在计时器表单上实现INotifyPropertyChanged,并定义一个表示计数的公共属性:

          private int count;
          public int Count
          {
              get { return count; }
              set
              {
                  if (count != value)
                  {
                      count = value;
                      OnPropertyChanged("Count");
                  }
              }
          }
          

          然后,在文本框表单上,将您的文本框文本值数据绑定到计时器表单的 Count 属性。

          textbox.DataBindings.Add("Text", timerForm, "Count");
          

          【讨论】:

            猜你喜欢
            • 2012-03-27
            • 2015-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-12
            • 1970-01-01
            相关资源
            最近更新 更多