代码之家  ›  专栏  ›  技术社区  ›  ata

标签文本未更新

c#
  •  2
  • ata  · 技术社区  · 16 年前

    我有一个带有状态栏的Windows窗体,显示应用程序的当前状态。 我有一个名为AppState的类,它在状态栏中更新了标签,并在Dispose中将状态更改回“就绪”。

    在代码中,当我执行如下操作时:

    using (AppState state = new AppState("Processing..."))
    {
         //Do some work that take some seconds
    }
    

    但是标签还是一样的。我没有任何例外。标签文本会更新,但在用户界面上,它会继续显示上一个值。我这里有什么东西不见了吗?

    你说得对,这是我唯一要做的。这是应用程序状态代码

    public class AppState : IDisposable
    {
        static string Default = "Ready";
    
        public AppState(string status)
        {
            Form.StatusLabel.Text = status;
        }
    
        public void Dispose()
        {
            Form.StatusLabel.Text = Default;
        }
    }
    
    6 回复  |  直到 11 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    总是一样的…

    如果你想开始一些需要一段时间的事情,不要在你的图形用户界面线程内这样做,否则你的图形用户界面会冻结(不更新标签,不调整大小,不移动,不做任何事情)。

    用application.doEvents()在上千个地方填充代码也是一种糟糕的做法。

    如果您有一些长时间运行的任务(长意味着1秒),您可能应该使用 BackgroundWorker . 也许开始的时候有点难,但如果你的程序变得更复杂,你会喜欢它的。由于这个事实,已经讨论了好几次了,这里是 link with some sample code .

    既然您知道了解决问题的正确工具(后台工作人员),那么您应该让它工作(或者就新的特定问题再问一个问题)。

        2
  •  4
  •   Jeremy McGee    16 年前

    看起来你想把 Application.DoEvents() 在设置 StatusLabel 文本字段值。这会告诉Windows窗体处理窗体的Windows事件队列,从而导致更改被重新绘制。

        3
  •  2
  •   serhio    16 年前

    为了“线程安全”使用 援引 ,并用 发票规格 形式如下:

        // code outside the myForm:-----------------------
        if (myForm.InvokeRequired)
            myForm.Invoke(new ChangeLabelEventHandler(ChangeLabel), "teeeest");
        else
            myForm.ChangeLabel("teeeest");
    
    
        // code in the myForm:-----------------------------
        public delegate void ChangeLabelEventHandler(string newText);
    
        private void ChangeLabel(string newLabelText)
        {
            this.label1.Text = newLabelText;
        }
    
        4
  •  2
  •   mrduclaw    16 年前

    我刚接触过C的东西,但为什么你不能做如下的事情呢?

    private void updateStatusBar(string status)
    {
        if (StatusLabel.InvokeRequired)
        {
            StatusLabel.Invoke((MethodInvoker)(() =>
                       {
                           StatusLabel.Text = status;
                       }));
        }
        else
        {
             StatusLabel.Text = status;
        }
    }
    

    何时更新状态?

        5
  •  0
  •   Matthias    16 年前

    也许多线程可以解决您的问题。

    最简单的方法是使用背景工作者。

    原因是只有当UI线程没有其他事情可做时,UI才能重新绘制。你用你的计算来阻止它。

        6
  •  0
  •   user3389579    11 年前

    使用label.refresh();这样可以节省很多时间。这对u很有用。