C# 如何从另一个类添加到列表框?

C# 如何从另一个类添加到列表框?,c#,C#,我已经看过几次这个帖子了,但我似乎无法让它为我申请 我想从我的ServerController类向我的home类中的列表框添加项目 不完全确定如何进行,因此任何帮助都将不胜感激 家庭课程: public partial class frmHome : Form { serviceController sc = new serviceController(); public ListBox lb = new ListBox(); public frmHome()

我已经看过几次这个帖子了,但我似乎无法让它为我申请

我想从我的
ServerController
类向我的
home
类中的列表框添加项目

不完全确定如何进行,因此任何帮助都将不胜感激

家庭课程:

public partial class frmHome : Form
{

    serviceController sc = new serviceController();
    public ListBox lb = new ListBox();

    public frmHome()
    {
        lb = new ListBox();
        InitializeComponent();
        serviceController sc = new serviceController();
    }

    //ListBox Add
    public void addItem(string item)
    {
        lb_msg.Items.Add(item);
        lb_msg.Items.Add(item);
        lb_msg.Items.Add("");
    }
}
public class serviceController
    {

        ServiceController[] scServices;

        //Start the service
        public void startServices()
        {
            scServices = ServiceController.GetServices();
            try
            {
                foreach (ServiceController scTemp in scServices)
                {
                    if (scTemp.ServiceName == "MSSQL$SQLSERVER" || scTemp.ServiceName == "SQLBrowser")
                    {
                        if (scTemp.Status == ServiceControllerStatus.Stopped)
                        {
                            //Check to see if service is disabled

                            home.addItem("Attempting to start " + scTemp.ServiceName);
                            scTemp.Start();
                            scTemp.WaitForStatus(ServiceControllerStatus.Running);
                        }
                        if (scTemp.Status == ServiceControllerStatus.Running)
                        {
                            home.addItem(scTemp.ServiceName + " is running");
                        }

                    }
                    else if (scTemp.Status == ServiceControllerStatus.Running)
                    {
                        home.addItem(scTemp.ServiceName + " is already running");
                    }
                }
                serverStatus();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
服务类别:

public partial class frmHome : Form
{

    serviceController sc = new serviceController();
    public ListBox lb = new ListBox();

    public frmHome()
    {
        lb = new ListBox();
        InitializeComponent();
        serviceController sc = new serviceController();
    }

    //ListBox Add
    public void addItem(string item)
    {
        lb_msg.Items.Add(item);
        lb_msg.Items.Add(item);
        lb_msg.Items.Add("");
    }
}
public class serviceController
    {

        ServiceController[] scServices;

        //Start the service
        public void startServices()
        {
            scServices = ServiceController.GetServices();
            try
            {
                foreach (ServiceController scTemp in scServices)
                {
                    if (scTemp.ServiceName == "MSSQL$SQLSERVER" || scTemp.ServiceName == "SQLBrowser")
                    {
                        if (scTemp.Status == ServiceControllerStatus.Stopped)
                        {
                            //Check to see if service is disabled

                            home.addItem("Attempting to start " + scTemp.ServiceName);
                            scTemp.Start();
                            scTemp.WaitForStatus(ServiceControllerStatus.Running);
                        }
                        if (scTemp.Status == ServiceControllerStatus.Running)
                        {
                            home.addItem(scTemp.ServiceName + " is running");
                        }

                    }
                    else if (scTemp.Status == ServiceControllerStatus.Running)
                    {
                        home.addItem(scTemp.ServiceName + " is already running");
                    }
                }
                serverStatus();
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
服务类
上,我想使用
主页.addItem

我是否认为我需要在我的家庭课堂上制作一个公共列表框,并将它和我设计的列表框链接起来

我想要实现的是:

我想让它检查
x
服务量以查看它的状态。如果已停止,则检查它是否已禁用并报告-如果已禁用,则尝试设置为自动,否则尝试启动它。我想写一个日志,因为它这样做

希望这能提供更多的澄清


谢谢

您可以通过构造函数传递它

public class serviceController
{
    private ListBox home;
    public serviceController(ListBox lb)
    {
       home = lb;
    }

    public void foo()
    {
        home.Items.Add("")
    }
}
现在,当您创建serviceController的新对象时,需要传递一个listbox

serviceController sv = new serviceController(lb_msg);
然后,当您在serviceController中时,可以像在主类中一样使用变量lb

访问其他表单控件的另一种方法是

frmHome form = new frmHome();
ListBox lb = (ListBox)form.Controls["nameOfControl"];
lb.Items.Add("");

另外:serviceController应该以大写的serviceController开头,您可以通过构造函数传递它

public class serviceController
{
    private ListBox home;
    public serviceController(ListBox lb)
    {
       home = lb;
    }

    public void foo()
    {
        home.Items.Add("")
    }
}
现在,当您创建serviceController的新对象时,需要传递一个listbox

serviceController sv = new serviceController(lb_msg);
然后,当您在serviceController中时,可以像在主类中一样使用变量lb

访问其他表单控件的另一种方法是

frmHome form = new frmHome();
ListBox lb = (ListBox)form.Controls["nameOfControl"];
lb.Items.Add("");

另外:serviceController应该以大写的serviceController开头,我强烈建议您采用绑定,而不是直接操作表单上的控件,目的是保持数据和UI分离。例如,您可以在类中有一个字符串列表(如果内存可用,则必须是BindingList),列表控件将绑定到该列表;通过这种方式,列表的内容将反映在UI中,您可以从其他地方自由地更新列表,将其作为数据,而无需考虑数据如何呈现的复杂性


最后,您可以提出类似于MVVM(模型-视图-视图-模型)或MVC的解决方案,在我看来,这是手动操作控件的最佳解决方案。

我强烈建议您采用绑定,而不是直接操作表单上的控件,目的是保持数据和UI分离。例如,您可以在类中有一个字符串列表(如果内存可用,则必须是BindingList),列表控件将绑定到该列表;通过这种方式,列表的内容将反映在UI中,您可以从其他地方自由地更新列表,将其作为数据,而无需考虑数据如何呈现的复杂性


最后,您可以提出类似于MVVM(model-view-viewmodel)或MVC的解决方案,我认为这是手动操作控件的最佳解决方案。

我已经编写了一个示例代码来演示我的建议。您必须将它与您正在使用的实际类型(例如类)相匹配。添加了代码注释,所以我不再在这里写太多了。如果你想玩这个代码,这里有一把小提琴:


我已经编写了一个示例代码来演示我的建议。您必须将它与您正在使用的实际类型(例如类)相匹配。添加了代码注释,所以我不再在这里写太多了。如果你想玩这个代码,这里有一把小提琴:


这立即违反了固体的SRP<代码>服务控制器在任何情况下都不应负责绑定GUI表单。它的唯一用途是跟踪
ServiceController
对象。您的主窗体可以订阅在
serviceController
中定义的事件,并从中获取这些消息。如果您感兴趣,我将演示如何操作。谢谢@Stefan-感谢
home.Items。请添加
Yes@NikhilVartak,那太棒了。我想使用订阅者,但不确定如何在这种情况下应用它。@SCramphorn检查我的答案。@NikhilVartak我不知道ServiceController是如何工作的,也不知道它是什么,我只是在一般编程中回答。您可以将其他类方法中的构造函数应用于列表或任何其他对象,以及立即违反SOLID中SRP的第二个解决方案<代码>服务控制器
在任何情况下都不应负责绑定GUI表单。它的唯一用途是跟踪
ServiceController
对象。您的主窗体可以订阅在
serviceController
中定义的事件,并从中获取这些消息。如果您感兴趣,我将演示如何操作。谢谢@Stefan-感谢
home.Items。请添加
Yes@NikhilVartak,那太棒了。我想使用订阅者,但不确定如何在这种情况下应用它。@SCramphorn检查我的答案。@NikhilVartak我不知道ServiceController是如何工作的,也不知道它是什么,我只是在一般编程中回答。您可以将其他类方法的构造函数应用于列表或任何其他对象,以及第二个解决方案。我有点困惑,为什么您有
public ListBox lb
,但使用
lb_msg
来实际添加内容?@johnyaw当时我正在试验。忘了把它拿出来。我有点困惑,为什么你有
public ListBox lb
,却用
lb_msg
来实际添加一些东西?@johnyaw当时我正在试验。忘了把它拿出来了。谢谢Nikhil,我会看看这个并从中学习。非常感谢!谢谢Nikhil,我会看看这个并从中学习。非常感谢!