我有一个带有标签的表单,也是一个外部类。在我的班级中,我有一个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
}
}
}
答案 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;
}
}
请注意,这些将在同一个线程中发生,因此根据您在循环中执行的其他操作,您可能无法获取消息。请考虑使用后台线程或异步代码。