C# Winforms从主窗体调用函数
我打开了一个主窗体,主窗体包含两个下拉菜单(组合框),它们链接到文本文件(如果存在)或内部文本文件(默认)。功能如下:C# Winforms从主窗体调用函数,c#,forms,winforms,C#,Forms,Winforms,我打开了一个主窗体,主窗体包含两个下拉菜单(组合框),它们链接到文本文件(如果存在)或内部文本文件(默认)。功能如下: public void readFiles() { string regionPath = @"C:\Users\" + Environment.UserName + @"\Regions.txt"; string salesPath = @"C:\Users\" + Environment.UserName + @"\SalesReps.txt"; S
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 = "";
}
public void readFiles()
{
字符串regionPath=@“C:\Users\”+Environment.UserName+@“\Regions.txt”;
字符串salesPath=@“C:\Users\”+Environment.UserName+@“\SalesReps.txt”;
流文件流;
流文件流1;
if(File.Exists(regionPath))
{
WriteLine(“区域文件存在”);
fileStream=File.Open(regionPath,FileMode.Open);
}
其他的
{
Console.WriteLine(“区域文件不存在”);
var resourceRegions=“SalesMap.Regions.txt”;
var assembly=assembly.getExecutionGassembly();
fileStream=assembly.GetManifestResourceStream(resourceRegions);
}
使用(StreamReader=newstreamreader(fileStream))
{
变量行=新列表();
int行=0;
而(!reader.EndOfStream)
{
string[]Line=reader.ReadLine().Split(',');
RegionNames.Add(第[0]行);
添加(第[1]行);
行++;
}
}
if(File.Exists(salesPath))
{
WriteLine(“SalesReps文件存在”);
fileStream1=File.Open(salesPath,FileMode.Open);
}
其他的
{
Console.WriteLine(“SalesReps文件不存在”);
var resourceSales=“SalesMap.SalesReps.txt”;
var assembly1=Assembly.getExecutionGassembly();
fileStream1=assembly1.GetManifestResourceStream(resourceSales);
}
使用(StreamReader reader1=新的StreamReader(fileStream1))
{
变量行=新列表();
int行=0;
而(!reader1.EndOfStream)
{
string[]Line=reader1.ReadLine().Split(',');
SalesRepNames.Add(第[0]行);
SalesRepEmails.Add(第[1]行);
SalesRepPhones.Add(第[2]行);
添加(第[3]行);
控制台写入线(世界其他地区);
行++;
}
}
comboBoxState.DataSource=区域名称;
comboBoxRepresentative.DataSource=SalesRepNames;
labelRepResult2.Text=“”;
labelContactResult2.Text=“”;
}
我还有一个“设置”表单,我希望设置表单上有一个按钮在主表单上运行此功能(从而强制主表单上的下拉菜单刷新其数据)
有什么建议吗?最简单的方法是将主窗体引用作为依赖项注入设置窗体,将其存储在局部变量/属性中,然后使用它。在设置窗体中:
public SettingsForm(MainForm mainForm)
{
TargetMainForm = mainForm;
// other constructor code
}
private MainForm TargetMainForm { get; set; }
private void DoSettingsThings()
{
// do settings things here
TargetMainForm.readFiles();
}
public event Action SettingsUpdated;
private void DoSettingsThings()
{
// do settings things here
SettingsUpdated?.Invoke();
}
在主窗体中,创建设置窗体时,只需执行新建设置窗体(this)
但是,这不是一个好的解决方案,因为设置窗体不应该依赖于主窗体。一个更简洁的解决方案是在设置窗体上创建一个事件,然后从主窗体订阅该事件。因此,在您的设置表单中:
public SettingsForm(MainForm mainForm)
{
TargetMainForm = mainForm;
// other constructor code
}
private MainForm TargetMainForm { get; set; }
private void DoSettingsThings()
{
// do settings things here
TargetMainForm.readFiles();
}
public event Action SettingsUpdated;
private void DoSettingsThings()
{
// do settings things here
SettingsUpdated?.Invoke();
}
在主窗体中,创建设置窗体实例时:
var settingsForm = new SettingsForm();
settingsForm.SettingsUpdated += readFiles;
请记住,这两种解决方案都很混乱,这是因为业务逻辑与表示层的分离很差(或根本没有分离)。但这超出了这个问题的范围。确定的可能重复,我正在使用您的第二个解决方案,它似乎正在调用“readFiles”函数,并更新下拉列表正在查看的数据(放入
控制台.writeline
代码的位以确保),但下拉列表似乎仍然停留在旧数据上。有什么想法吗?(我尝试了readFiles()
函数中的comboBox.Update();
和comboBox.Refresh();
,但两者都没有成功)@derakantrican,这完全取决于你的程序。您的设置表单是否将数据保存到这些文本文件中?它们在被写入后是否正确关闭?尝试调试所有(如果有)中间步骤,在写入文件后用记事本检查这些文件。我不能帮你解决你的问题。编辑:尽量不要像那样改变你的评论。现在我的回答似乎是错的。对不起,我并不是想暗示我想让你帮我调试这个-只是想知道你是否知道有什么想法可以帮助我。也很抱歉更改了评论-我点击[Enter]以为它会产生一个新行,但它提交了评论(因此我不得不编辑评论以添加其余部分)