Winforms从主窗体调用函数

本文关键字:调用 函数 窗体 Winforms | 更新日期: 2023-09-27 18:36:23

我打开了一个主窗体,主窗体包含几个下拉菜单(comboBox),这些菜单链接到文本文件(如果存在)或内部文本文件(默认)。函数是这样的:

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 = "";
}

我还有一个"设置"表单,我希望设置表单上的一个按钮在主表单上运行此功能(从而强制主表单上的下拉菜单刷新其数据)。

有什么建议吗?

Winforms从主窗体调用函数

最简单的方法是将主窗体引用作为依赖项注入到设置窗体中,将其存储在局部变量/属性中,然后使用它。在设置表单中:

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;

请记住,这两种解决方案都是混乱的,这源于业务逻辑与表示层的分离不佳(或没有)。但这超出了这个问题的范围。