【问题标题】:InvokeRequired and ToolStripStatusLabelInvokeRequired 和 ToolStripStatusLabel
【发布时间】:2012-09-07 07:20:15
【问题描述】:

在我的应用程序中,我有一个负责所有数据库操作的类。它从主类调用,并在操作完成后使用委托调用方法。 因为它是异步的,所以我必须在我的 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”类型不能用作 泛型类型或方法中的类型参数“T” 'SimpleApp.Helpers.InvokeIfRequired(T, System.Action)'。有 没有隐式引用转换 'System.Windows.Forms.ToolStripStatusLabel' 到 'System.Windows.Forms.Control'。

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

【问题讨论】:

标签: c# winforms .net-3.5 invokerequired


【解决方案1】:

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

【讨论】:

  • 我在一秒钟前在 Google 上找到了相同的信息 :) 但是我应该如何从 statusStrip 访问 ToolStripStatusLable?所以我可以将 statusStrip 传递给我的方法?
  • msdn.microsoft.com/en-us/library/… MSDN 是你的朋友 :)
  • 你很快 :) 但如何访问项目?只能按索引还是我可以按名字来做?例如,如果我将 ToolStripStatusLabel 命名为“状态”,我如何在我的委托中访问它?只喜欢statusStrip1.Items[0]?我问是因为我将动态添加控件到 statusStrip 并且我可以弄乱我的控件的索引。
  • msdn.microsoft.com/en-us/library/25b5ws77.aspx 只需点击两下...请阅读文档
【解决方案2】:

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

不要做toolStripStatusLabel1.InvokeIfRequired,而是做toolStripStatusLabel1.GetCurrentParent().InvokeIfRequired

【讨论】:

  • 感谢您的回答。我一直在与Control合作,但是在得到您的答复后,我才刚刚完成工作。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2011-03-04
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-01-23
    • 2013-04-17
    相关资源
    最近更新 更多