C# - 从另一个类的循环变量更新表单标签

时间:2017-02-16 02:22:11

标签: c# forms class

我有一个带有标签的表单,也是一个外部类。在我的班级中,我有一个1到1000的for循环。如何从我的班级到我的表格标签显示1到1000的值?

//external class

public class TestClass
{
    public void myLoop()
    {
        for (int i = 1; i <= 1000; i++)
        {
            // show value of i to label
        }
    }
}

1 个答案:

答案 0 :(得分:1)

假设您将表单引用为form1,并且该表单具有名为label1的标签,该标签对于TestClass是公共的/可访问的:

public class TestClass
{
    public void myLoop()
    {
        for (int i = 1; i <= 1000; i++)
        {
            // show value of i to label
            form1.label1.Text = i.ToString();
            // allow message pumping to redraw the label
            Application.DoEvents();
            // pause long enough to see it before the next one happens
            System.Threading.Thread.Sleep(100);
        }
    }
}

我不建议正常使用Application.DoEvents作为生产代码;但如果您正在运行UI线程而不使用异步代码,那么这将是&#34; hacky&#34;在循环过程中获取所有窗口事件的方法(主要是WM_PAINT以使标签重绘)。

更好的方法是使用事件:

public class TestClass  {
   public class ProgressEventArgs : EventArgs {
        public int Value { get; set; }
   }
   public event EventHandler<ProgressEventArgs> Progress;
   public void myLoop() {
        for (int i = 0; i <= 1000; ++i) {
            var evt = Progress;
            if (evt != null) {
                evt.Invoke(this, new ProgressEventArgs() { Value = i; });
            }
        }
   }
}

并以下列形式处理该事件:

   public class TestForm : Form {
        private somevent_click(object sender, EventArgs evt) {
            var test = new TestClass();
            test.Progress += test_Progress;
            test.myLoop();
        }
        private void test_Progress(object sender, TestClass.ProgressEventArgs evt) {
            label1.Text = evt.Value;
        }
   }

请注意,这些将在同一个线程中发生,因此根据您在循环中执行的其他操作,您可能无法获取消息。请考虑使用后台线程或异步代码。