C# 通过Logic.cs在MainForm上填充组合框
我能够通过主窗体上的StreamReader填充组合框。现在我发现,我需要在不同对话框的几个不同组合框中提供相同的信息。这很有效,因为我似乎无法进入组合框“cbTask”。错误状态为“当前上下文中不存在名称“cbTask”。代码C# 通过Logic.cs在MainForm上填充组合框,c#,winforms,combobox,C#,Winforms,Combobox,我能够通过主窗体上的StreamReader填充组合框。现在我发现,我需要在不同对话框的几个不同组合框中提供相同的信息。这很有效,因为我似乎无法进入组合框“cbTask”。错误状态为“当前上下文中不存在名称“cbTask”。代码 public static void TaskPopulate() { try { StreamReader task = new StreamReader(dataFolder + TasksF
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调用中我没有所有内容。谢谢,非常感谢。祝你有美好的一天!!