C# 在类的新实例中使用 Forms 元素
Posted
技术标签:
【中文标题】C# 在类的新实例中使用 Forms 元素【英文标题】:C# Using Forms Element in a new instance of a class 【发布时间】:2021-06-15 19:00:27 【问题描述】:首先,我对 C# 有点陌生,但我理解的足够多,可以独自工作。
现在我遇到了一段时间以来使用 Windows 窗体的问题。
我正在尝试创建一个名为“FiestaService”的类的新实例,其中包含一些变量(字符串、字符串、标签、按钮)。
我想将label1
和loginBtn
插入FiestaService Login
,这样我就可以在SCStatusCheck()
中调用它。
使用当前代码它只会告诉我
字段初始化器不能引用非静态字段
label = label1
和 button = loginBtn
相同。
public partial class Main : Form
public Main()
InitializeComponent();
public List<FiestaService> FS = new List<FiestaService>();
public FiestaService Login = new FiestaService()
serviceDataName = "Crestia_Login",
serviceTextName = "Login",
label = label1, // this is the point where i am stuck with the label1
button = loginBtn // same
;
private void Main_Load(object sender, EventArgs e)
label1.Text = Login.serviceTextName;
FS.Add(Login);
//... here are some more of them
public void SCStatusCheck() // is called with a 2 seconds Timer inside the Main_Load method
foreach(var service in FS)
ServiceController SC = new ServiceController(service.serviceDataName);
if (SC.Status.Equals(ServiceControllerStatus.Running))
service.label.BackColor = Color.LightGreen;
service.button.Text = "Stop";
public class FiestaService
public string serviceDataName;
public string serviceTextName;
public Label label;
public Button button;
我最后想说的是我确实尝试过
public static Main main = new Main();
和
public static FiestaService Login = new FiestaService() ..., label = main.label1, button = main.loginBtn ;
但在开始调试后它告诉我
对象引用未设置为对象实例。
“正在”工作..有点.. 我可以用Login FiestaService
调用它们,但SCStatusCheck()
方法不能更改与标签/按钮相关的任何内容。
谢谢大家!如果您看到任何我可以做得比我做得更好的地方,请随时纠正我!
..是的,我已经阅读了一些帖子。然而,他们都没有找到合适的解决方案。
【问题讨论】:
不清楚,你在问什么问题?作为一般性评论,这看起来确实像您将 UI 元素与不需要的数据混合在一起,最好将所有 UI 组件和数据分开。但是我不确定这是否是您要问的 很抱歉,这有点复杂。我正在尝试为类实例 Login 分配一个标签和一个按钮。正如您在 FiestaService 登录中看到的那样。我更容易调用 Login.loginBtn 而不是按钮本身,因为我有更多这样的实例。 FiestaService 的每个实例是否有不同的标签+按钮?还是每次都一样? 我有 12 个 FiestaService 实例,每个实例都有一个标签和按钮 【参考方案1】:我想我看到了你的问题 - 标签/按钮是在这一行创建的:
InitializeComponent();
因此,您应该将 FiestaService 实例的创建推迟到此之后。可能是这样的:
public FiestaService Login;
public Main()
InitializeComponent();
Login = new FiestaService()
serviceDataName = "Crestia_Login",
serviceTextName = "Login",
label = label1, // this is the point where i am stuck with the label1
button = loginBtn // same
;
你拥有它的方式,当你这样做时:
new FiestaService()
它发生在标签创建之前,所以你只需将它们设置为 null
另外,想想如何将数据与 UI 分开。像这样混合起来并不是一个好习惯,但如果它有效并且您只是在学习,请不要太担心。
【讨论】:
我的意思是它只有在我将 FiestaService 实例放在另一个方法(如 Main 或 Main_Load)中时才有效。但是我不能用另一种方法调用它们,这就是我需要的。 您可以将 Login 定义为类变量,以便像现在一样从任何地方访问它,但是创建实例的新 FS 需要稍后发生。 现在我看到了您的编辑,这是一个如此简单的解决方案,但它的工作原理。谢谢!以上是关于C# 在类的新实例中使用 Forms 元素的主要内容,如果未能解决你的问题,请参考以下文章