0

我有这个代码:

namespace TuyenTk
{
    public partial class Form1 : Form
    {
        Form2 _form2 = new Form2("");
        public Form1()
        {
            InitializeComponent();
            _form2.Show();
            int i = 0;
            while (i < 5)
            {
                _form2.label1.Text = "" + i;
                Thread.Sleep(500);
                i++;
            }
        }
    }

    public class Form2 : Form
    {
        public System.Windows.Forms.Label label1;
        public System.ComponentModel.Container components = null;

        public Form2()
        {
            InitializeComponent();
        }
        private void InitializeComponent(string t)
        {
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.Location = new System.Drawing.Point(5, 5);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(290, 100);
            this.label1.TabIndex = 0;
            this.label1.Text = t;
            // 
            // Form2
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(300, 100);
            this.ControlBox = false;
            this.Controls.Add(this.label1);
            this.Name = "Form2";
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
            this.ShowInTaskbar = false;
            this.ResumeLayout(false);    
        }
    }
}

当 Form1 运行时,它显示 Form2,但 Form2.label1 背景是白色的,并且没有文字。
2.5 秒后,Form2.label1.Text = 4。所以 i 的值 0、1、2、3 不会出现。我该如何解决?非常感谢你。

4

2 回答 2

3

您想要做的(定期更新标签)是通过使用 Timer 组件来实现的(您可以将它从 ToolBox 拖放到您的表单上)。

public partial class Form1 : Form
{
   Form2 _form2 = new Form2("");
   Timer _timer;
   int _counter;

   public Form1()
   {
       InitializeComponent();          
       _form2.Show();

       if (components == null)
           components = new System.ComponentModel.Container();
       _timer = new Timer(components); // required for correct disposing

       _timer.Interval = 500;
       _timer.Tick += timer_Tick;
       _timer.Start();
   }

   private void timer_Tick(object sender, EventArgs e)
   {
       if (_counter < 5)
       {
          _form2.label1.Text = _counter.ToString();
          _counter++;
          return;
       }

       _timer.Stop();
   }

在其他表单上创建公共控件也不是一个好主意 - 如果您确实需要更新 form2 上的某些值,那么最好在 Form2 类中声明公共方法/属性,这将更新标签:

public partial class Form2 : Form
{
     public int Value
     {             
         set { label1.Text = value.ToString(); }
     }
}

还可以考虑将计时器移至 Form2(让此表单自行更新)。

于 2012-12-08T14:56:00.473 回答
0

如果您Thread.Sleep(500);在 UI 线程中调用,则 GUI 将不负责任。这就是为什么你得到你的 Fomr2.label1 的背景白色。我建议你移动你的代码

while (i < 5)
{
   _form2.label1.Text = "" + i;
   Thread.Sleep(500);
   i++;
}

到另一个线程。您可以参考此链接来实现您的目标。

于 2012-12-08T14:54:06.713 回答