2014-07-08 38 views
-1

的詞典我有寫一個DataGridView到一個文本文件的方法:創建函數功能

private void textToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
    saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; 
    saveFileDialog1.FilterIndex = 2; 
    saveFileDialog1.RestoreDirectory = true; 
    saveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmm") + "_icmquery_" + GetTabName() + ".txt"; 
    if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
    using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate)) 
    { 
     switch (mainTabGroup.SelectedTab.Name.ToString()) 
     { 
     case "findScriptsTab": 
      WriteTextFile(fs, findScriptsDataGrid); 
      break; 
     case "dialNumberAuditTab": 
      WriteTextFile(fs, findScriptsDataGrid); 
      break; 
     case "calltypeRequalificationTab": 
      WriteTextFile(fs, ctrDataGrid); 
      break; 
     case "targetAuditTab": 
      WriteTextFile(fs, targetAuditDataGrid); 
      break; 
     } 
    } 
    } 
} 
public void WriteTextFile(FileStream fs, DataGridView dataGrid) 
{ 
    using (TextWriter tw = new StreamWriter(fs)) 
    { 
    foreach (DataGridViewRow row in dataGrid.Rows) 
    { 
     string line = string.Empty; 
     foreach (DataGridViewCell cell in row.Cells) 
     { 
     line = line + cell.Value + ","; 
     } 
     line = line.TrimEnd(','); 
     tw.WriteLine(line); 
    } 
    } 
} 

但不是在textToolStripMenuItem_Click()使用大開關語句我想定義在我的形式的字典。我曾嘗試過:

private Dictionary<TabPage, Func<FileStream, DataGridView>> WriteTextFileByTab(FileStream fs) = new Dictionary<TabPage, Func<FileStream, DataGridView>>() 
{ 
    {findScriptsTab, WriteTextFile(fs, findScriptsDataGrid)} 
}; 

但是視覺工作室甚至不會將此註冊爲有效的事情。我手動輸入了這些信息,但沒有一個會填充任何內容。當我將鼠標懸停在「findScriptsTab」上時,它表示它的字段類似於類型,而WriteTextFile表示同樣的東西。關於如何將switch語句正確轉換爲字典的任何想法,我只能說:WriteTextFileByTab[mainTabGroup.SelectedTab];

+0

這不是一個有效的東西......它看起來像你試圖寫一個方法,但使用錯誤的語法。或者,如果您不應該在另一種方法中使用關鍵字private。檢查你的語法,如果你不能發現錯誤,澄清代碼塊在哪裏(即在一個方法內部或類內部)。 – Chris

+0

所有這些生活在一個表單類中。 – aaronmallen

+1

你絕對可以做到這一點 - 我過去做過類似的事情。一種觀察是你已經將字典定義爲'Dictionary > - 但是,'WriteTextFile'返回void,所以你需要一個'Action'來代替。 –

回答

2

在定義字典本身之前,您無法爲字典中的每個項目定義方法的參數。需要聲明的參數的標識構建字典的每個值時:

private Dictionary<TabPage, Func<FileStream, DataGridView>> WriteTextFileByTab 
    = new Dictionary<TabPage, Func<FileStream, DataGridView>>() 
{ 
    {findScriptsTab, fs => WriteTextFile(fs, findScriptsDataGrid)} 
}; 

當然,如果findScriptsTabfindScriptsDataGrid是實例字段,我懷疑他們是,當初始化時,你將無法使用它們另一個實例字段。因此,您需要在構造函數中初始化此字典,而不是在聲明它時。

它也像在你的字典代表(根據您的實施WriteTextFile)實際上並不需要返回DataGridView所以相應的委託來使用實際上是一個Action<FileStream>,而不是Func<FileStream, DataGridView>

+0

我讀過。我最終通過將它包裝在一個返回字典的方法中來解決它,然後我使用LINQ查詢來調用它'WriteTextFileByTab(fs).FirstOrDefault(p => p.Key == mainTabGroup.SelectedTab).Value() ;' – aaronmallen

+0

@aaronmallen這是一個非常糟糕的設計方案。正如我所說的,你應該簡單地在你的構造函數中初始化字典。 (如果你想將它封裝到一個方法中,那就好了)。每次你想要獲取一個值時,你都不應該重新創建字典。接下來,您不應該使用'FirstOrDefault'從它的關鍵字中獲取字典的值。 「Dictionary」的全部*點*能夠有效地查找給定鍵的值。你用它的索引器來做到這一點。 – Servy

+0

你能編輯你的答案來更好地說明這一點嗎?告訴我你將如何將它包裝在名爲Main()的表單類中。 – aaronmallen