我们目前有一个从串行通信中读取数据的应用程序。在整个应用程序中,我们需要在 UI 中显示这些数据,因此我们创建了一个使用 BeginInvoke 更新文本框/标签/数字/进度条的方法。
然而,这开始变得很麻烦,因为每个控件都需要自己的“Setter”,所以我们已经有 20 多个方法,它们基本上都做同样的事情。
虽然我可以看到一种将其泛化为特定控件的简单方法(例如,只有 1 个用于标签,1 个用于文本框),但最好只有 1 个(可能是扩展)方法,我们可以调用它来更新 UI 中的数据.
这是我们原来的方法到处张开:
private void SetCell1Cell2Async(decimal value)
{
if (spinCell1Cell2.InvokeRequired)
{
spinCell1Cell2.BeginInvoke(new EventHandler(delegate
{
spinCell1Cell2.Value = value;
}));
}
else
{
if (spinCell1Cell2.IsDisposed) return; // Do not process if the control has been disposed of
if (spinCell1Cell2.IsHandleCreated)
{
// This handle may not be created when creating this form AFTER data is already flowing
// We could capture this data for future display (i.e. via deferUpdate = true or similar), but it is easier to ignore it
// i.e. Do Nothing
return;
}
spinCell1Cell2.Value = value;
}
}
这是我们当前的方法(这适用于使用该Text
属性显示数据的控件):
delegate void SetTextAsyncCallback(Control ctrl, string text);
public static void SetTextAsync(this Control invoker, string text)
{
if (invoker.InvokeRequired)
{
invoker.BeginInvoke(new SetTextAsyncCallback(SetTextAsync), invoker, text);
}
else
{
if (invoker.IsDisposed) return; // Do not process if the control has been disposed of
if (!invoker.IsHandleCreated)
{
// This handle may not be created when creating this form AFTER data is already flowing
// We could capture this data for future display (i.e. via deferUpdate = true or similar), but it is easier to ignore it
// i.e. Do Nothing
return;
}
invoker.Text = text;
}
}
如您所见,此方法适用于任何使用该Text
属性来显示其数据的东西。
理想情况下,我希望能够“传入”要更新的属性,并提供一种需要string
, double
,decimal
等的方法boolean
,但是我有点迷失从这里去哪里。
任何帮助表示赞赏。