Winforms从主窗体调用函数

时间:2016-02-27 00:32:33

标签: c# forms winforms

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

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

我还有一个“设置”表单,我想在设置表单上使用一个按钮在主窗体上运行此功能(从而强制主窗体上的下拉菜单刷新其数据)。

有什么建议吗?

1 个答案:

答案 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;

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