Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms从主窗体调用函数_C#_Forms_Winforms - Fatal编程技术网

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]以为它会产生一个新行,但它提交了评论(因此我不得不编辑评论以添加其余部分)