创建Func的字典

时间:2014-07-08 16:13:56

标签: c# .net winforms dictionary

我有一个将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()中使用大型switch语句,而是想在我的表单中定义一个字典。我试过了:

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];

1 个答案:

答案 0 :(得分:2)

在定义字典本身之前,无法为字典中的每个项定义参数。在构造字典的每个值时,您需要声明参数的标识符:

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

当然,如果findScriptsTabfindScriptsDataGrid是实例字段,因为我怀疑它们是,在初始化另一个实例字段时,您将无法使用它们。因此,您需要在构造函数中初始化此字典,而不是在声明它时。

看起来你的字典中的代表(基于你的WriteTextFile的实现)实际上不需要返回DataGridView所以要使用的相应委托实际上是{{1} },而不是Action<FileStream>