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”的类的新实例,其中包含一些变量(字符串、字符串、标签、按钮)。 我想将label1loginBtn 插入FiestaService Login,这样我就可以在SCStatusCheck() 中调用它。 使用当前代码它只会告诉我

字段初始化器不能引用非静态字段

label = label1button = 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 元素的主要内容,如果未能解决你的问题,请参考以下文章

C#中能否在类的内部实例化一个本类的对象?

C#中List<T>的作用与用法,求详解 谢谢

C#中类的创建和实例化

C#根据用户输入在类实例中查找数组[重复]

C#:为啥我必须在类的变量中使用公共访问修饰符?

c# 中类的实例化