C# InvokeRequired和ToolStripStatusLabel

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)

在我的应用程序中,我有一个负责所有数据库操作的类。它从主类调用,并在操作完成后使用委托调用方法。 因为它是异步的,我必须在GUI上使用invoke,所以我创建了一个简单的扩展方法:

 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;
});