【发布时间】:2020-04-21 19:25:09
【问题描述】:
我有一个 WinForms 应用程序,它正在从 BackgroundWorker 更新 TableLayoutPanel。根据设备输入是打开 (1) 还是关闭 (0),颜色和一些文本会相应更改。
try
{
//Define a new TLP to hold the search tablelayoutpanel.
//search for the iterated card number.
//get the status label using GetControl from Position.
TableLayoutPanel TLP = new TableLayoutPanel();
string IO_Card_Name = "ED527_" + i.ToString();
TLP = TLP_IO_Info.Controls.Find(IO_Card_Name, true).FirstOrDefault() as TableLayoutPanel;
try { lbl = TLP.GetControlFromPosition(4, 0) as Label; } catch { lbl = null; };
//if card is found (because input is active, colour the TLP (card) according to its state.
if (TLP != null && lbl != null && INPUTS[i - 1] == 1)
{
TLP.BackColor = Color.Green;
foreach (Label l in TLP.Controls)
{
l.BackColor = Color.Green;
}
lbl.Invoke((MethodInvoker)delegate { lbl.Text = "ON"; });
}
else if (TLP != null && lbl != null && INPUTS[i - 1] == 0)
{
TLP.BackColor = Color.White;
foreach (Label l in TLP.Controls)
{
l.BackColor = Color.White;
}
lbl.Invoke((MethodInvoker)delegate { lbl.Text = "OFF"; });
}
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
};
TLP 包含 5 个标签。当线路更新时,更新显示出一些明显的滞后。有没有办法可以在主 UI 线程上执行类似于 SuspendLayout() / ResumeLayout 的操作?
****EDIT 显示之前和之后 - IOLabel 列在 Status 列之前稍稍更新。
【问题讨论】:
-
我确定你不是这个意思
TableLayoutPanel TLP = new TableLayoutPanel();除其他外。,,,, -
为什么在 Invoke 方法中设置文本,但在没有 Invoke 的情况下设置颜色?我认为对 GUI 的所有更改都必须在 Invoke 中。所有这些代码仅更改标签,将其全部放在一个 Invoke 中(它将在主线程中调用)。填充 INPUTS 的 BackgroundWorker 函数的另一部分让工作在自己的线程中。如果扫描设备非常频繁,则取消更新 UI 可能会出现时间延迟。将小 Thread.Sleep() 放在一个扫描循环之后或在计时器中扫描。
-
@JQSOFT 我先说一下我没有接受过作为计算机科学家的正式培训的事实,所以我确信我的代码中有许多失礼。
-
@AlexeyObukhov - 我确实这么认为,但由于某种原因它不会抛出带有颜色的异常......我会将它全部弹出到调用中。此代码块是从具有
Thread.Sleep(100)暂停的后台工作人员调用的。 -
对不起哥们,只是想传递一个提示进行检查。犯错是工作的重要组成部分。没有错误/错误/异常意味着您不会编写太多代码。现在,如果您请详细说明一下以澄清诸如
Device开/关部分是什么意思?什么是INPUTS数组?以便我们更好地理解问题。
标签: c# backgroundworker tablelayoutpanel