C# InvokeRequired和ToolStripStatusLabel
在我的应用程序中,我有一个负责所有数据库操作的类。它从主类调用,并在操作完成后使用委托调用方法。 因为它是异步的,我必须在GUI上使用invoke,所以我创建了一个简单的扩展方法:C# InvokeRequired和ToolStripStatusLabel,c#,winforms,.net-3.5,invokerequired,C#,Winforms,.net 3.5,Invokerequired,在我的应用程序中,我有一个负责所有数据库操作的类。它从主类调用,并在操作完成后使用委托调用方法。 因为它是异步的,我必须在GUI上使用invoke,所以我创建了一个简单的扩展方法: public static void InvokeIfRequired<T>(this T c, Action<T> action) where T: Control { if (c.InvokeRequired)
public static void InvokeIfRequired<T>(this T c, Action<T> action)
where T: Control
{
if (c.InvokeRequired)
{
c.Invoke(new Action(() => action(c)));
}
else
{
action(c);
}
}
但当我尝试在ToolStripStatusLabel或ToolStripProgressBar上调用它时,我得到一个错误:
类型“System.Windows.Forms.ToolStripStatusLabel”不能用作
泛型类型或方法中的类型参数“T”
'SimpleApp.Helpers.InvokeIfrequeired(T,System.Action)'。有
没有来自的隐式引用转换
“System.Windows.Forms.ToolStripStatusLabel”到
“System.Windows.Forms.Control”
我知道这可能是一个简单的修复,但我能处理它:/这是因为ToolStripItem(导致错误的这两个项的基础)是一个组件,而不是控件。 尝试在拥有扩展方法的工具条上调用扩展方法并调整代理
方法。我想把它们加起来,算出可接受的解决方案。您可以使用ToolStripStatusLabel的GetCurrentParent方法从组件获取控件
不要使用
toolStripStatusLabel1.invokeIfrequered
,而是使用GetCurrentParent().invokeIfrequered
扩展方法执行toolStripStatusLabel1.invokeIfrequered
。InvokeRequired
public static void ToolStripStatusInvokeAction<TControlType>(this TControlType control, Action<TControlType> del)
where TControlType : ToolStripStatusLabel
{
if (control.GetCurrentParent().InvokeRequired)
control.GetCurrentParent().Invoke(new Action(() => del(control)));
else
del(control);
}
我刚刚在Google上找到了相同的信息:),但是我应该如何从statusStrip访问ToolStripStatusLable?所以我可以把statusStrip传递给我的方法?MSDN是您的朋友:)您很快:)但如何访问项目?只能按索引,或者我可以按名称来做?例如,如果我将ToolStripStatusLabel命名为“状态”,我如何在我的代理中访问它?仅与statusStrip1.Items[0]类似?我这样问是因为我会动态地将控件添加到statusStrip中,这样会弄乱控件的索引。只需点击两下。。。请阅读文档,也许这个类似的问题会对你有所帮助。谢谢你的回答。我一直在努力控制,但在得到你的答案后,我刚刚完成我的工作。
public static void ToolStripStatusInvokeAction<TControlType>(this TControlType control, Action<TControlType> del)
where TControlType : ToolStripStatusLabel
{
if (control.GetCurrentParent().InvokeRequired)
control.GetCurrentParent().Invoke(new Action(() => del(control)));
else
del(control);
}
toolStripAppStatus.ToolStripStatusInvokeAction(t =>
{
t.Text= "it works!";
t.ForeColor = Color.Red;
});