6

当我通过拖放创建控件时,VS会自动生成如下代码:

public System.Windows.Forms.Label label1;

当我想将该控件的修饰符更改为静态时,我转到 Form1.Designer.cs 并编辑为:

public static System.Windows.Forms.Label label1;

没关系。但是当我修改每个控件时,VS会自动将其更改为原点:(。那么如何将控件的修改更改为静态?

对不起,我英语不好:(


评论中的代码:

public static void setLabelInfoVisible(bool visible) 
{ 
   if (Form1.labelInfo.InvokeRequired) 
   { 
      setLabelInfoVisibleDelegate del =
         new setLabelInfoVisibleDelegate(setLabelInfoVisible);
      Form1.labelInfo.Invoke(del, new object[] { visible }); 
   } 
   else 
   { 
     Form1.labelInfo.Visible = visible; 
   } 
}
4

7 回答 7

7

看来您的实际问题是另一个问题:从另一个线程更新控件。这应该通过静态控制来完成!

这些相关问题应该可以解决您的问题:

如何从 C# 中的另一个线程更新 GUI 上的文本框

如何从 C# 中的另一个线程更新 GUI?

于 2010-01-11T12:07:25.990 回答
4

设计器代码不应该被用户修改,因为每次您在设计器中更改表单时,Visual Studio 都会重新编写它(正如您所发现的那样)。

一种将控件声明和初始化移动到非设计器代码文件的方法。但是,这意味着您的控件将不再出现在设计器中。

编辑:不是让其他线程可以访问您的控件的方法!我想不出使控件静态化的正当理由。

于 2010-01-11T11:48:17.090 回答
4

韦恩,

  1. ,您不希望 Control 是静态的。解释你为什么认为你这样做,我们可以找出更好的选择。

  2. 不要在 *.Designer.cs 文件中进行编辑。工具(表单/数据集/...设计器)有权覆盖所有内容。

编辑:

你有2个问题要解决,

  1. 从另一个类访问控件。这应该通过将实例引用传递给其他类来完成。就像是:
    void Form1_Load(..) { otherObject.Form = this; }

  2. 使用 Control 窗体另一个线程。你永远不能直接这样做,总是使用 Control.Invoke()。Divo 列出了 2 个有用的链接。

于 2010-01-11T11:52:23.570 回答
2

您必须将定义从自动生成的设计器代码中移出,从文件 Form.Designer.cs移到您的代码Form.cs中。

于 2010-01-11T11:48:45.480 回答
0

也许您可以创建一个继承相关控件的新类,然后将单例模式应用于它。

这样你就有了一个全局(线程安全)的访问点。

于 2010-01-11T15:48:05.127 回答
0

我发现最好的方法是做与上面相反的事情。尽管他们没有解释不这样做的原因,例如将控制设为静态是一件坏事;意味着我需要发布这个来解决你的问题,因为这是一个你想要回答的问题,而不是一个只是被告知的问题......为什么......或者不......没有这样的理由并且不回答你的问题。请看下文。

制作控件时,您可以在该表单的 Designer.cs 按钮上找到新的私有创建控件代码。它应该接近尾声,但例如,如果您制作一个按钮,它将看起来像这样。

" #endregion

    Private Button button1;"

如果您只是将其更改为如下...

" #endregion

    public static Button button1; "

您会注意到设计器内所有引用 this.button1 的控件代码都会出现红色错误。您可以删除“这个”。在每一个上,都会很好。

要在另一个类中引用,请确保您使用的是上面的命名空间。

使用主窗体

然后在您的类代码下面,您可以将按钮引用为....

mainform.button1.text = "废话";

于 2020-12-16T23:01:08.087 回答
0

以下是如何使用它的示例:

Label label1 = Application.OpenForms["Form1"].Controls["label1"] as Label;
于 2020-10-11T16:28:56.597 回答