我有一个将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];
?
答案 0 :(得分:2)
在定义字典本身之前,无法为字典中的每个项定义参数。在构造字典的每个值时,您需要声明参数的标识符:
private Dictionary<TabPage, Func<FileStream, DataGridView>> WriteTextFileByTab
= new Dictionary<TabPage, Func<FileStream, DataGridView>>()
{
{findScriptsTab, fs => WriteTextFile(fs, findScriptsDataGrid)}
};
当然,如果findScriptsTab
和findScriptsDataGrid
是实例字段,因为我怀疑它们是,在初始化另一个实例字段时,您将无法使用它们。因此,您需要在构造函数中初始化此字典,而不是在声明它时。
看起来你的字典中的代表(基于你的WriteTextFile
的实现)实际上不需要返回DataGridView
所以要使用的相应委托实际上是{{1} },而不是Action<FileStream>
。