【问题标题】:Calling a class method from form with no relation to class从与类无关的表单调用类方法
【发布时间】:2012-03-26 18:22:54
【问题描述】:

对不起,标题不好,我的脑海里充满了混乱,我不知道如何最好地描述它。来了。

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

http://pastebin.com/wei5FFpB

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

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

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

有没有一种优雅的方式来实现这一点,或者我在设计方面完全搞砸了我的整个程序?如果我有,我会很感激有人指出如何实现这一目标的正确方向。

谢谢!

【问题讨论】:

    标签: c# list class reference


    【解决方案1】:

    如果我理解正确,您关心的是在三个(或更多)表单之间共享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 void readDataFile(ref List<Branch> myArgus)
    

    【讨论】:

    • 静态类似乎是个好主意。这样我就可以随时在我的代码中更改myArgus,并将其直接传递给writeDataFile(),而无需在类之间传递它并使事情变得复杂。
    • 正确,如果您需要一个对象的单个共享实例,您可以安全地将其存储在类的静态字段中。
    • +1 建议删除方法签名中的 ref,但如果 OP 将多个文件添加到同一个 myArgs 实例,这将需要在调用方使用 @987654333 进行更多工作@ 将多个数据文件合并到同一个列表中
    【解决方案2】:

    除了 Wiktor 的回答之外,您的 StreamReaderStreamWriter 对象应包装在 using 语句中,以便正确处理它们,即使出现错误。

    在您的readDataFile 方法中:

    using(StreamReader reader = new StreamReader(dataFileLoc))
    {
    
        int branchCounter = 0;
        while (reader.Peek() >= 0)
        {
            .
            .
            .
        }
    }
    

    在您的writeDataFile 方法中:

    using(StreamWriter writer = new StreamWriter(dataFileLoc))
    {
        for (int i = 0; i < myArgus.Count; i++)
        {    
            .
            .
            .
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2016-01-16
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多