如何在Visual Studio中将控件的修改器更改为静态

时间:2010-01-11 11:45:11

标签: c# modifier

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

public System.Windows.Forms.Label label1;

当我想将该控件的修饰符更改为Static时,我转到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; 
   } 
}

7 个答案:

答案 0 :(得分:6)

您的实际问题似乎是另一个问题:从另一个线程更新控件。这应该 NOT 由静态控件完成!

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

  

<强> How to update textbox on GUI from another thread in c#

     

<强> How to update GUI from another thread in C#?

答案 1 :(得分:4)

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

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

修改是让其他线程可以访问控件的方法!我无法想出使控件静止的正当理由。

答案 2 :(得分:4)

韦恩,

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

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

  3. 编辑:

    您有两个问题需要解决,

    1. 从另一个类访问Control。这应该通过将实例引用传递给另一个类来完成。类似的东西:
      void Form1_Load(..) { otherObject.Form = this; }

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

通过这种方式,您可以获得全局(线程安全)访问点。

答案 5 :(得分:0)

以下是使用方法的示例:

Label label1 = Application.OpenForms["Form1"].Controls["label1"] as Label;

答案 6 :(得分:0)

我发现最好的方法是做与上述相反的事情。尽管他们没有解释不这样做的原因,例如使控件静态化是一件坏事;意味着我需要发布此信息以解决您的问题,因为这是您要回答的问题,而不是一个仅被告知的问题……为什么……或不……在没有任何理由的情况下也不会回答你的问题。请参见下面。

制作控件时,可以在designer.cs按钮上找到该表单的新创建的私有控件代码。它应该快结束了,但是例如,如果您按下按钮,它将看起来像这样。

“ #endregion

    Private Button button1;"

如果仅将其更改为以下内容...

“ #endregion

    public static Button button1; "

您会注意到所有与此代码相关的控制代码。设计器内部的button1将出现红色错误。您可以删除“此”。每一个都很好,

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

使用主表单

然后在您的班级代码中,您可以将按钮引用为...。

mainform.button1.text =“等等”;