当我通过拖放创建控件时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;
}
}
答案 0 :(得分:6)
您的实际问题似乎是另一个问题:从另一个线程更新控件。这应该 NOT 由静态控件完成!
这些相关问题可以解决您的问题:
<强> How to update textbox on GUI from another thread in c# 强>
答案 1 :(得分:4)
设计器代码不应该由用户修改,因为每次在设计器中更改表单时,Visual Studio都会重写它(如您所发现的那样)。
将控制声明和初始化移动到非设计器代码文件的一种方法。但是,这意味着您的控件将不再出现在设计器中。
修改强> 这不是让其他线程可以访问控件的方法!我无法想出使控件静止的正当理由。
答案 2 :(得分:4)
韦恩,
否,您不希望控件是静态的。解释为什么你认为你做了,我们可以找出更好的选择。
请勿在* .Designer.cs文件中进行编辑。工具(表单/数据集/ ...设计者)有权覆盖所有内容。
您有两个问题需要解决,
从另一个类访问Control。这应该通过将实例引用传递给另一个类来完成。类似的东西:
void Form1_Load(..) { otherObject.Form = this; }
使用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 =“等等”;