2012-03-26 24 views
1

對不起,我的頭腦充滿了混亂,我不知道如何最好地描述它。開始。從窗體調用類方法與類沒有關係

我有一個類叫做FileHandler。這個類從一個文件中讀取數據並將其放入一個List中,並且在我對它進行修改後,它還有一個將List寫回文件的方法。這個類看起來是這樣的:

http://pastebin.com/wei5FFpB

現在,這個類的readDataFile方法被稱爲在我的主要形式(當你運行該程序,最初加載一個)。從那裏,我打開另一個表格BranchOverview。從那裏,另一個可以打開,稱爲EditProduct。在此編輯產品表格中,我可以通過參考編輯產品詳細信息,並在myArgus列表中更改。我遇到的問題是調用readDataFile方法的FileHandler類。

因爲我沒有辦法從EditProduct參考myArgus,我不能因爲它接受myArgus作爲參數調用writeDataFile方法。

我能想到的唯一方法就是在每個表單類中都有一個方法,它調用它下面的類,一直向下,直到它到達可以傳遞myArgus的主表單。

有沒有一種優雅的方式來實現這一點,或者我完全搞砸了我的整個程序設計?如果我有,我希望指出如何實現這一目標的正確方向。

謝謝!

回答

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) 
+0

靜態類似乎是一個不錯的主意。這樣我可以在我的代碼中隨時更改'myArgus',並直接將它傳遞給'writeDataFile()',而不必在類之間傳遞並使事情變得複雜。 – 2012-03-26 18:43:51

+0

正確,如果您需要一個對象的單個共享實例,則可以將其安全地存儲在類的靜態字段中。 – 2012-03-26 18:44:54

+0

+ 1用於推薦刪除方法簽名中的'ref',但是如果OP將多個文件添加到相同的'myArgs'實例,則需要使用'List .AddRange()'來在主叫方進行更多的工作。合併多個數據文件到相同的列表 – psubsee2003 2012-03-26 18:51:25

0

除了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++) 
    {  
     . 
     . 
     . 
    } 
} 
+0

我會這樣做,謝謝:) – 2012-03-26 18:54:45