1

我正在使用计时器每 2 秒将文本输出到文本框。但似乎它不起作用。知道什么是错的。这是我的代码:

public partial class Form1 : Form
{
    public Form1()
    {
      InitializeComponent();
    }

    public static System.Timers.Timer aTimer;

    public void BtnGenData_Click(object sender, EventArgs e)
    {
      aTimer = new System.Timers.Timer(10000);

      // Hook up the Elapsed event for the timer.
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

      // Set the Interval to 2 seconds (2000 milliseconds).
      aTimer.Interval = 2000;
      aTimer.Enabled = true;
    }

    public static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
      string GenData = "Welcome";
      Form1 frm1 = new Form1();
      frm1.TboxData.AppendText(GenData.ToString());
    }
}

实际上我没有看到任何输出。

4

2 回答 2

1

问题出在这种方法中:

public static void OnTimedEvent(object source, ElapsedEventArgs e)
{


    string GenData = "Welcome";
    Form1 frm1 = new Form1();
    frm1.TboxData.AppendText(GenData.ToString());

}

通过调用new Form1();您创建一个新表单。此表单被创建为隐藏,您更改了文本,但它不显示,并且在此方法结束时它被垃圾收集。你想要的是重用你现有的。完全删除此行并使用您现有的表格。默认情况下,名称应为form1

public static void OnTimedEvent(object source, ElapsedEventArgs e)
{


    string GenData = "Welcome";
    form1.TboxData.AppendText(GenData.ToString());

}
于 2012-12-03T08:02:15.910 回答
1

尽管这与您在代码中遇到的问题没有直接联系,但是...

从 MSDN System.Timers.Timer

基于服务器的 Timer 设计用于多线程环境中的工作线程。

在 Windows 窗体中,您可以使用System.WindowsForms.Timer

    System.Windows.Forms.Timer timer;

    public Form1()
    {
        InitializeComponent();

        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(timer_Tick);
    }

    public void BtnGenData_Click(object sender, EventArgs e)
    {
        BtnGenData.Enabled = false;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        timer.Stop();
        BtnGenData.Enabled = true;

        //do what you need
    }

至于您的代码,为什么要使计时器静态?尝试使用这个:

 public partial class Form1 : Form
 {
    public Form1()
    {
        InitializeComponent();
    }

    public System.Timers.Timer aTimer;

    public void BtnGenData_Click(object sender, EventArgs e)
    {
        aTimer = new System.Timers.Timer(10000);
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
    }

     public void OnTimedEvent(object source, ElapsedEventArgs e)
     {
        this.TboxData.AppendText("Welcome");
     } 
 }

您还应该考虑,如果您按两次按钮会发生什么...

于 2012-12-03T08:04:32.387 回答