从c#winform

时间:2018-05-07 13:08:59

标签: c# winforms

我目前正在public partial class Form1 : Form

中使用此代码更新我的表单
this.Invoke((MethodInvoker)delegate
{
    Intellisale_Lastprocessed_Item_Label.Text = "example"
}

因为我有大量的UI元素,所以我宁愿把所有的ui更新代码都放到另一个类中。

因此,我建立了班级" UiUpdate"。
不幸的是,从这个班级我收到的消息: "表单1不包含Intellisale_Lastprocessed_Item_Label的定义"

enter image description here

可能我忽略了一些非常简单的事情,但我还没有找到答案。

编辑:

由于建议,我将代码更改为以下内容:

class UiUpdate
{
    public void UpdateIntellisale(Form1 form)
    {
        form.Intellisale_Lastprocessed_Item_Label.text = "example";
    }
}

不幸的是,我仍然收到没有标签定义的消息

更新2:

如上所述,标签在设计师中被定义为私人

3 个答案:

答案 0 :(得分:1)

您对static 进行Form1引用,而不是对该类的特定实例进行引用。将您需要的实例传递给您的方法:

public void UpdateIntellisale(Form1 form)
{
    form.Intellisale_Lastprocessed_Item_Label.Text = "test";
    // etc...
}

当您从表单中调用它时,您会将其引用传递给您的表单。如果从表单本身调用,则可能是this。基本上你需要你的助手类/方法来了解它正在使用的形式。

答案 1 :(得分:0)

您需要将Form1类的对象传递给UpdateIntellisale方法。 像:

class UiUpdate {
    public void UpdateIntellisale(Form1 form) {
        form.Intellisale_Lastprocessed_Item_Label.text = "test";
    }
}

并称之为:UpdateIntellisale(this)(当然仅当this属于Form1类时)

答案 2 :(得分:0)

有几个问题: 1.您将标签称为将其定义为Form1的静态成员。    请改用实例名称。 e.g:

Form1 form = new Form1();
form.Intellisale_Lastprocessed_Item_Label.Text = "example" 
// Be aware of an InvalidOperationException with the message, "Control control name accessed from a thread other than the thread it was created on." that is throw if you use this code.

请参阅:https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls

  1. 通常,标签在设计器文件中是私有的。 简单的方法是将它们公开,但直接从其他类中解决字段并不是一件好事。请改用财产。