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()
在同一列表中合并多个数据文件