C# 通过Logic.cs在MainForm上填充组合框

C# 通过Logic.cs在MainForm上填充组合框,c#,winforms,combobox,C#,Winforms,Combobox,我能够通过主窗体上的StreamReader填充组合框。现在我发现,我需要在不同对话框的几个不同组合框中提供相同的信息。这很有效,因为我似乎无法进入组合框“cbTask”。错误状态为“当前上下文中不存在名称“cbTask”。代码 public static void TaskPopulate() { try { StreamReader task = new StreamReader(dataFolder + TasksF

我能够通过主窗体上的StreamReader填充组合框。现在我发现,我需要在不同对话框的几个不同组合框中提供相同的信息。这很有效,因为我似乎无法进入组合框“cbTask”。错误状态为“当前上下文中不存在名称“cbTask”。代码

    public static void TaskPopulate()
    {

        try
        {
            StreamReader task = new StreamReader(dataFolder + TasksFile);
            string tasks = task.ReadLine();

            while (tasks != null)
            {
                cbTask.Items.Add(tasks);
                tasks = task.ReadLine();
            }

        }

        catch
        {

        }
    }
dataFolder是路径,TasksFile是文件名。如果我把它留在主窗体上,效果很好

有人能给我指一下正确的方向吗??感谢您提前观看!!我很感激。祝你今天愉快


编辑:读了几遍后,我的问题似乎不清楚。我正在尝试将StreamReader中的信息添加到多个子对话框的多个组合框中。

在主窗口或单独的类中是否有该方法?如果它在一个单独的类中,这可能解释为什么找不到“cbTask”


另外,尝试使用类似于以下内容的内容
string variable=otherForm.TextBox1.Text

将其移动到一个新的服务,并根据您需要的任何形式的服务引用

示例代码:

public class MyService()
{
    public IEnumerable<string> LoadTasks()
    {
        var taskList = new List<string>();
        try
        {
            StreamReader task = new StreamReader(dataFolder + TasksFile);
            string tasks = task.ReadLine();

            while (tasks != null)
            {
                taskList.Add(tasks);
                tasks = task.ReadLine();
            }    
        }
        catch
        {
        }
        return taskList;
    }
}

public Form MainForm()
{
    private MyService _myService = new MyService();

    public static void TaskPopulate()
    {
        foreach(var task in _myService.LoadTasks())
        {
            cbTask.Items.Add(task);
        }
    }
}
公共类MyService()
{
公共IEnumerable LoadTasks()
{
var taskList=新列表();
尝试
{
StreamReader任务=新建StreamReader(数据文件夹+任务文件);
string tasks=task.ReadLine();
while(任务!=null)
{
任务列表。添加(任务);
tasks=task.ReadLine();
}    
}
抓住
{
}
返回任务列表;
}
}
公共表格MainForm()
{
private MyService_MyService=new MyService();
公共静态void TaskPopulate()
{
foreach(在_myService.LoadTasks()中的var任务)
{
cbTask.Items.Add(任务);
}
}
}

我的第一个答案提供了一个企业风格的解决方案,因此,如果您希望用一种更简单、扩展性更低的方式来应对挑战,这里有另一种方法

public static class MyTaskComboBoxPopulater()
{
    public static void LoadTasksToCombobox(ComboBox comboBox)
    {
        try
            {
                StreamReader task = new StreamReader(dataFolder + TasksFile);
                string tasks = task.ReadLine();

                while (tasks != null)
                {
                    comboBox.Items.Add(tasks);
                    tasks = task.ReadLine();
                }    
            }
        catch
        {
        }
    }
}

public Form MainForm()
{
    public static void TaskPopulate()
    {
        MyTaskComboBoxPopulater.LoadTasksToCombobox(cbTask);
    }
}

我认为无法找到cbTask,因为它当前存在于Form1.cs中。我正在尝试在WidgetLogic.cs中访问它。这就是TaskPopulate()所在的位置。我在Form1.cs加载WidgetLogic.TaskPopulate()时访问它@FrankPytel在编写方法之前尝试调用该类。例如
textBox1.Text=otherForm.textBox1.Text这就是我刚才要去的地方。尝试从逻辑中排除cbTask,并仅从TaskPopulate()调用tasks。好像有很多工作要做。我所有的代码对于在每个winForm中调用几乎都一样短。组合框的内容来自我正在阅读的文件,所以看起来像是浪费。还有其他人吗@从设计角度来看,还有另一个重要的区别。虽然您可以直接填充组合框,但这会将您的应用程序逻辑与UI关注点耦合起来。这将使将来很难更改UI。如果您将应用程序逻辑与UI分离,那么您只有一个地方需要维护逻辑,并且如果您添加新表单或更改UI使用数据的方式,逻辑就不必更改。这太棒了。我希望我能再花3分钟弄清楚所以我理解,如果您有时间,临时变量“combobox”保存列表,然后当我在MainForm中调用时,它会将这些项添加到cbTask中?实际上,我不得不将调用从public static void更改为private void,因此在onLoad调用中我没有所有内容。谢谢,非常感谢。祝你有美好的一天!!