2012-03-26 12 views
1

悪いタイトルで申し訳ありませんが、私の心は混乱していて、それをどのように表現するのが最もよいか分かりません。ここに行く。クラスと関係のないフォームからクラスメソッドを呼び出す

私はFileHandlerというクラスを持っています。このクラスは、ファイルからデータを読み取り、それをListに格納します。また、リストを変更した後にファイルに書き戻すメソッドもあります。クラスは次のようになります。今

http://pastebin.com/wei5FFpB

、そのクラスのreadDataFile方法は、私のメインフォーム(あなたがプログラムを実行するときに最初にロードします1)で呼ばれています。そこから、BranchOverviewという別のフォームを開きます。そこから、EditProductと呼ばれる別のものを開くことができます。この編集フォームでは、商品の詳細を参考に編集し、myArgusリストで変更することができます。私が問題を抱えているのは、クラスのreadDataFileメソッドをEditProductから呼び出すことです。私はEditProductからmyArgusを参照する方法がありませんので、それはパラメータとしてmyArgusを受け入れるため

は、私がwriteDataFileメソッドを呼び出すことはできません。

私はそれを行うと考えることができる唯一の方法は、それが私のメインフォームになるまで下のクラスを呼び出す各フォームクラスのメソッドを持つことですmyArgusが渡すことができます。

これを達成するための優雅なやり方があるのですか、私はデザインの面で私のプログラム全体を完全に台無しにしましたか?もし私が持っていれば、これを達成するための正しい方向が指摘されていることを感謝します。

ありがとうございます!

答えて

1

私が正しく理解している場合は、myArgusのインスタンスを3つ(またはそれ以上)のフォームの間で共有することが懸念されます。

しかし、少なくともいくつかの方法があります。これをフォーム間で渡すことができます(コンストラクタパラメータなど)。あるフォームのインスタンスを別のフォームに渡すことができます。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() 

の代わりにWiktor第の答えに加えて
public void readDataFile(ref List<Branch> myArgus) 
+0

静的クラスは、良いアイデアのように思えます。そうすれば、私は自分のコードで 'myArgus'を変更し、クラス間で渡したり、複雑にすることなく直接' writeDataFile() 'に渡すことができます。 –

+0

オブジェクトの単一の共有インスタンスが必要な場合は、クラスの静的フィールドに安全に保存できます。 –

+0

+1はメソッドシグネチャの 'ref'を削除することを推奨しますが、OPが複数のファイルを同じ' myArgs'インスタンスに追加している場合、 'List .AddRange()'を使って呼び出し側でもっと多くの作業が必要になります複数のデータファイルを同じリストにマージする – psubsee2003

0

彼らはエラーがあっても、適切に配置されているので、あなたのStreamReaderStreamWriterオブジェクトは、usingステートメントでラップする必要があります。あなたのwriteDataFile方法で

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

    int branchCounter = 0; 
    while (reader.Peek() >= 0) 
    { 
     . 
     . 
     . 
    } 
} 

:あなたのreadDataFile方法で

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

私はそれをします、ありがとう:) –

関連する問題