C# 如何在VisualStudio中将控件的修改器更改为静态

C# 如何在VisualStudio中将控件的修改器更改为静态,c#,modifier,C#,Modifier,当我通过拖放创建控件时,VS会自动生成如下代码: public System.Windows.Forms.Label label1; 当我想将该控件的修改器更改为Static时,我转到Form1.Designer.cs并编辑为: public static System.Windows.Forms.Label label1; 没关系。但当我修改每个控件时,VS会自动将其更改为原点:(。 那么,如何将控件的修改更改为静态 对不起,我英语不好:( 注释中的代码: public static v

当我通过拖放创建控件时,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; 
   } 
}

设计器代码不应该由用户修改,因为每当您在设计器中更改表单时(如您所发现的),VisualStudio都会重新编写它

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

编辑:
这不是使控件可供其他线程访问的方法!我想不出使控件处于静态状态的有效原因。

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

  • ,您不希望控件是静态的。请解释您为什么认为是静态的,我们可以找出更好的替代方案

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

  • 编辑: 你有两个问题要解决

  • 从另一个类访问控件。这应该通过将实例引用传递给另一个类来完成。类似:
    void Form1\u Load(..){otherObject.Form=this;}

  • 从另一个线程使用控件。您永远不能直接这样做,请始终使用Control.Invoke()。Divo列出了两个有用的链接


  • 您的实际问题似乎是另一个:从另一个线程更新控件。这应该而不是通过静态控件来完成

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


    也许您可以创建一个继承相关控件的新类,然后对其应用singleton模式


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

    下面是一个如何使用它的示例:

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

    我发现最好的方法是做上述相反的事情。虽然他们没有解释不这样做的原因,例如使控件静态是一件坏事;这意味着我需要发布这篇文章来解决你的问题,因为这是一个你想要回答的问题,而不是一个仅仅被告知的问题…为什么…或者不…在这样一个问题背后没有任何理由d没有回答您的问题。请参见下文

    创建控件时,您可以在该窗体的designer.cs按钮上找到新的私有创建的控件代码。它应该在末尾,但如果您创建了一个按钮,则会像这样

    “#结束区域

        Private Button button1;"
    
        public static Button button1; "
    
    如果您只是将其更改为以下内容

    “#结束区域

        Private Button button1;"
    
        public static Button button1; "
    
    您会注意到,设计器中所有引用此按钮的控制代码都会出现红色错误。您可以删除每个按钮上的“this.”,这样就可以继续了

    若要在另一个类中引用,请确保使用上述命名空间

    使用mainform

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


    mainform.button1.text=“布拉赫”你为什么需要静态控件?嗨,我需要静态控件,因为我想在其他线程中访问它!你可以使用.Invoce控制方法。你能给我举个例子吗?谢谢!@Wayne:请看我答案中的链接以获取示例。嗨,Henk,我希望控件是静态的,因为我想在其他线程中访问它(这个线程在另一个类中)。如果不将控件的修饰符更改为static,我怎么做?谢谢!这解决了直接编辑设计器文件的问题(因此这很好),但它不能解决实际问题(从其他线程访问控件)。我已经使用了委托。这是我的代码:public static void setLabelInfoVisible(bool-visible){if(Form1.labelInfo.invokererequired){setLabelInfoVisibleDelegate=new setLabelInfoVisibleDelegate(setLabelInfoVisible);Form1.labelInfo.Invoke(del,new object[]{visible});}else{Form1.labelInfo.Visible=Visible;}}但是这个标签在另一个类中,所以我认为它一定是一个静态标签?