C# 从窗体调用与类无关的类方法

C# 从窗体调用与类无关的类方法,c#,list,class,reference,C#,List,Class,Reference,很抱歉这个糟糕的标题,我的脑子里充满了困惑,我不知道如何最好地描述它。来吧 我有一个名为FileHandler的类。这个类从文件中读取数据并将其放入列表中,它还有一个方法在我对列表进行修改后将列表写回文件。该类如下所示: 现在,该类的readDataFile方法以我的主窗体(运行程序时最初加载的窗体)调用。从那里,我打开另一个名为BranchOverview的表单。从那里,可以打开另一个名为EditProduct。在此编辑产品表单中,我可以通过引用编辑产品详细信息,并在myArgus列表中对其

很抱歉这个糟糕的标题,我的脑子里充满了困惑,我不知道如何最好地描述它。来吧

我有一个名为
FileHandler
的类。这个类从文件中读取数据并将其放入列表中,它还有一个方法在我对列表进行修改后将列表写回文件。该类如下所示:

现在,该类的
readDataFile
方法以我的主窗体(运行程序时最初加载的窗体)调用。从那里,我打开另一个名为
BranchOverview
的表单。从那里,可以打开另一个名为
EditProduct
。在此编辑产品表单中,我可以通过引用编辑产品详细信息,并在
myArgus
列表中对其进行更改。我遇到的问题是从
EditProduct
调用
FileHandler
类中的
readDataFile
方法

由于我无法从
EditProduct
引用
myArgus
,因此无法调用
writeDataFile
方法,因为它接受
myArgus
作为参数

我能想到的唯一方法是在每个表单类中都有一个方法来调用它下面的类,一直到它到达可以传递
myArgus
的主表单为止

是否有一种优雅的方式来实现这一点,或者我完全搞砸了我的整个程序的设计?如果我有,我会很感激被指在正确的方向上如何实现这一点


谢谢

如果我理解正确,您关心的是在三个(或更多)表单之间共享
myArgus
的实例

但至少有几种不同的方法可以做到这一点。可以在表单之间传递(例如,作为构造函数参数),可以将一个表单的实例传递给另一个表单,可以使用单独的类来保存
myArgus
的共享(静态)实例

代码中还有其他小问题。例如,您实际上不必通过
ref
传递列表,因为您不是在更改引用本身,而是在更改列表的内容

然后,这看起来很难看:

myArgus.Add(new Branch());
myArgus[branchCounter]._branchID = Convert.ToInt32(reader.ReadLine());
myArgus[branchCounter]._branchName = reader.ReadLine();
...
你的意思是:

Branch newBranch = new Branch();

newBranch._branchID = ...;
newBranch._branchName = ...;

myArgus.Add( newBranch );
然后,当一个方法应该返回数据(
readDataFile
)时,我想每个人都希望签名是:

public List<Branch> readDataFile()
public List readDataFile()
而不是

public void readDataFile(ref List<Branch> myArgus)
public void readDataFile(参考列表myArgus)

如果我理解正确,您关心的是在三个(或更多)表单之间共享
myArgus
的实例

但至少有几种不同的方法可以做到这一点。可以在表单之间传递(例如,作为构造函数参数),可以将一个表单的实例传递给另一个表单,可以使用单独的类来保存
myArgus
的共享(静态)实例

代码中还有其他小问题。例如,您实际上不必通过
ref
传递列表,因为您不是在更改引用本身,而是在更改列表的内容

然后,这看起来很难看:

myArgus.Add(new Branch());
myArgus[branchCounter]._branchID = Convert.ToInt32(reader.ReadLine());
myArgus[branchCounter]._branchName = reader.ReadLine();
...
你的意思是:

Branch newBranch = new Branch();

newBranch._branchID = ...;
newBranch._branchName = ...;

myArgus.Add( newBranch );
然后,当一个方法应该返回数据(
readDataFile
)时,我想每个人都希望签名是:

public List<Branch> readDataFile()
public List readDataFile()
而不是

public void readDataFile(ref List<Branch> myArgus)
public void readDataFile(参考列表myArgus)

除了Wiktor的答案之外,您的
StreamReader
StreamWriter
对象应该包装在using语句中,这样即使出现错误,也可以正确地处理它们

readDataFile
方法中:

using(StreamReader reader = new StreamReader(dataFileLoc))
{

    int branchCounter = 0;
    while (reader.Peek() >= 0)
    {
        .
        .
        .
    }
}
using(StreamWriter writer = new StreamWriter(dataFileLoc))
{
    for (int i = 0; i < myArgus.Count; i++)
    {    
        .
        .
        .
    }
}
在您的
writeDataFile
方法中:

using(StreamReader reader = new StreamReader(dataFileLoc))
{

    int branchCounter = 0;
    while (reader.Peek() >= 0)
    {
        .
        .
        .
    }
}
using(StreamWriter writer = new StreamWriter(dataFileLoc))
{
    for (int i = 0; i < myArgus.Count; i++)
    {    
        .
        .
        .
    }
}
使用(StreamWriter writer=newstreamwriter(dataFileLoc))
{
for(int i=0;i
除了Wiktor的答案之外,您的
StreamReader
StreamWriter
对象应该包装在using语句中,这样即使出现错误,也可以正确地处理它们

readDataFile
方法中:

using(StreamReader reader = new StreamReader(dataFileLoc))
{

    int branchCounter = 0;
    while (reader.Peek() >= 0)
    {
        .
        .
        .
    }
}
using(StreamWriter writer = new StreamWriter(dataFileLoc))
{
    for (int i = 0; i < myArgus.Count; i++)
    {    
        .
        .
        .
    }
}
在您的
writeDataFile
方法中:

using(StreamReader reader = new StreamReader(dataFileLoc))
{

    int branchCounter = 0;
    while (reader.Peek() >= 0)
    {
        .
        .
        .
    }
}
using(StreamWriter writer = new StreamWriter(dataFileLoc))
{
    for (int i = 0; i < myArgus.Count; i++)
    {    
        .
        .
        .
    }
}
使用(StreamWriter writer=newstreamwriter(dataFileLoc))
{
for(int i=0;i
静态类似乎是个好主意。这样,我可以随时更改
myArgus
,并将其直接传递到
writeDataFile()
,而无需在类之间传递,也不会使事情变得复杂。正确,如果需要对象的单个共享实例,您可以将其安全地存储在类的静态字段中。+1用于建议删除方法签名中的
ref
,但如果OP将多个文件添加到同一
myArgs
实例中,这将需要调用方使用
List.AddRange()进行更多工作
将多个数据文件合并到同一个列表中使用静态类似乎是个好主意。这样,我可以随时更改
myArgus
,并将其直接传递到
writeDataFile()
,而无需在类之间传递,也不会使事情变得复杂。正确,如果需要对象的单个共享实例,您可以安全地将其存储在类的静态字段中。+1用于建议删除方法签名中的
ref
,但如果OP将多个文件添加到同一
myArgs
实例中,这将需要调用方使用
List.AddRange()
在同一列表中合并多个数据文件