7

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

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

当我尝试在 textBox 上调用它时,这很好用:

textBox1.InvokeIfRequired(c => { c.Text = "it works!"; });

但是当我尝试在 ToolStripStatusLabel 或 ToolStripProgressBar 上调用它时,出现错误:

类型“System.Windows.Forms.ToolStripStatusLabel”不能用作泛型类型或方法“SimpleApp.Helpers.InvokeIfRequired(T, System.Action)”中的类型参数“T”。没有从“System.Windows.Forms.ToolStripStatusLabel”到“System.Windows.Forms.Control”的隐式引用转换。

我知道这可能是一个简单的修复,但我可以处理它:/

4

3 回答 3

9

这是因为 ToolStripItem(这两个导致错误的基础)是一个组件,而不是一个控件。尝试在拥有它们的工具条上调用您的扩展方法并调整您的委托方法。

于 2012-09-14T06:49:46.303 回答
2

我想补充接受的解决方案。您可以使用 ToolStripStatusLabel 的 GetCurrentParent 方法从组件中获取控件。

与其做toolStripStatusLabel1.InvokeIfRequired,不如做toolStripStatusLabel1.GetCurrentParent().InvokeIfRequired

于 2018-07-25T20:48:31.520 回答
1

扩展方法使用 GetCurrentParent().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);
    }

调用 ToolStripStatusInvokeAction 扩展:

toolStripAppStatus.ToolStripStatusInvokeAction(t =>
{ 
    t.Text= "it works!";
    t.ForeColor = Color.Red;
});
于 2019-10-10T12:18:33.727 回答