我打开了一个主窗体,主窗体包含一些链接到文本文件(如果存在)或内部文本文件(默认)的下拉菜单(组合框)。功能是这样的:
public void readFiles()
{
string regionPath = @"C:\Users\" + Environment.UserName + @"\Regions.txt";
string salesPath = @"C:\Users\" + Environment.UserName + @"\SalesReps.txt";
Stream fileStream;
Stream fileStream1;
if (File.Exists(regionPath))
{
Console.WriteLine("Regions file exists");
fileStream = File.Open(regionPath, FileMode.Open);
}
else
{
Console.WriteLine("Regions file does not exist");
var resourceRegions = "SalesMap.Regions.txt";
var assembly = Assembly.GetExecutingAssembly();
fileStream = assembly.GetManifestResourceStream(resourceRegions);
}
using (StreamReader reader = new StreamReader(fileStream))
{
var lines = new List<string[]>();
int Row = 0;
while (!reader.EndOfStream)
{
string[] Line = reader.ReadLine().Split(',');
RegionNames.Add(Line[0]);
RegionParts.Add(Line[1]);
Row++;
}
}
if (File.Exists(salesPath))
{
Console.WriteLine("SalesReps file exists");
fileStream1 = File.Open(salesPath, FileMode.Open);
}
else
{
Console.WriteLine("SalesReps file does not exist");
var resourceSales = "SalesMap.SalesReps.txt";
var assembly1 = Assembly.GetExecutingAssembly();
fileStream1 = assembly1.GetManifestResourceStream(resourceSales);
}
using (StreamReader reader1 = new StreamReader(fileStream1))
{
var lines = new List<string[]>();
int Row = 0;
while (!reader1.EndOfStream)
{
string[] Line = reader1.ReadLine().Split(',');
SalesRepNames.Add(Line[0]);
SalesRepEmails.Add(Line[1]);
SalesRepPhones.Add(Line[2]);
SalesRepRegions.Add(Line[3]);
Console.WriteLine(Row);
Row++;
}
}
comboBoxState.DataSource = RegionNames;
comboBoxRepresentative.DataSource = SalesRepNames;
labelRepResult2.Text = "";
labelContactResult2.Text = "";
}
我还有一个“设置”表单,我想在设置表单上使用一个按钮在主窗体上运行此功能(从而强制主窗体上的下拉菜单刷新其数据)。
有什么建议吗?
答案 0 :(得分:1)
最简单的方法是将主表单引用作为依赖项注入到您的设置表单中,将其存储在本地变量/属性中,然后使用它。在您的设置表单中:
public SettingsForm(MainForm mainForm)
{
TargetMainForm = mainForm;
// other constructor code
}
private MainForm TargetMainForm { get; set; }
private void DoSettingsThings()
{
// do settings things here
TargetMainForm.readFiles();
}
在您的主要表单中,创建设置表单时,只需执行new SettingsForm(this)
。
然而,这不是一个好的解决方案,因为设置表单不应该取决于您的主表单。更清洁的解决方案是在您的设置表单上创建一个事件,并从您的主表单订阅。所以在你的设置表格中:
public event Action SettingsUpdated;
private void DoSettingsThings()
{
// do settings things here
SettingsUpdated?.Invoke();
}
在主窗体中,当您创建设置表单实例时:
var settingsForm = new SettingsForm();
settingsForm.SettingsUpdated += readFiles;
请记住,这两种解决方案都很混乱,这源于业务逻辑与表示层的差异(或没有)分离。但这超出了这个问题的范围。