[英]Reading a file, write to diffrent table if (streamwriter =…)
我在将文件读入datagridviews时遇到了一些问题(具体来说是3)。
using (StreamReader sr = new StreamReader(fn))
{
string[] datarow; int tableno=0;
colt = sr.ReadLine();
Console.Out.WriteLine(colt);
if (colt == "@Table")
{
tableno++;//Here tableno is equals 1
colt = sr.ReadLine();
// Console.Out.WriteLine(colt);
// Console.Out.WriteLine(tableno);
}
switch (tableno)
{
case 1:
columns = colt.Split(';');
Count = columns.Length;
foreach (string c in columns)
{
Table1.Columns.Add(c, typeof(String));
}
while (!sr.EndOfStream)
{
rowt = sr.ReadLine();
if (rowt == "@Table") break; //Here program supposed to break this case, go up and increase tableno
datarow = rowt.Split(';');
Table1.Rows.Add(datarow);
}
dataGridView1.DataSource = Table1;
sr.Close();
break;
case 2:
columns = colt.Split(';');
Count = columns.Length;
foreach (string c in columns)
{
Table2.Columns.Add(c, typeof(String));
}
while (!sr.EndOfStream)
{
rowt = sr.ReadLine();
if (rowt == "@Table") break;
datarow = rowt.Split(';');
Table2.Rows.Add(datarow);
}
dataGridView2.DataSource = Table2;
sr.Close();
break;
case 3:
columns = colt.Split(';');
Count = columns.Length;
foreach (string c in columns)
{
Table3.Columns.Add(c, typeof(String));
}
while (!sr.EndOfStream)
{
rowt = sr.ReadLine();
if (rowt == "@Table") break;
datarow = rowt.Split(';');
Table3.Rows.Add(datarow);
}
dataGridView3.DataSource = Table3;
sr.Close();
break;
}
}
}
我的文本文件看起来像:
@Table
K1;K2;K3
....
..
@Table
K1;K4
..
..
@Table
K1;K5
运行此代码后,数据仅出现在gridview1中。 变量tableno不想增加。 有人有主意吗?
您可以通过在StreamReader
的using
范围内创建一个while循环来使现有代码正常工作,并在完成表格之后停止关闭阅读器(阅读器将通过using
语句为您关闭,因此无论如何都不需要)。 目前的问题是,您看到下一张表的开始或旧表的末尾(在您的答案和问题中有所不同..),您跳出了该表的读取循环,但是没有任何改变流到“开始”并开始处理下一个,它会在此时退出该方法。
但是,您应该从根本上改变您的方法,因为它非常重复。 目前您有3张桌子,但是如果您有N张桌子怎么办? 从维护,测试和可扩展性的角度来看,重复代码是不好的做法。 例如,如果文件格式发生更改,则必须在3个地方进行更改,并进行3倍的测试,就像只编写一次一样。
这是一个示例,说明如何编写它以处理任意数量的表并重新使用相同的逻辑来读取每个表:
private List<DataTable> ReadDataTables(string fileName)
{
List<DataTable> tables = new List<DataTable>();
DataTable currentTable = null;
using (StreamReader reader = new StreamReader(fileName))
{
while (!reader.EndOfStream)
{
var currentLine = reader.ReadLine(); // get the next line from the file
if (String.IsNullOrWhiteSpace(currentLine)) continue; // ignore blank rows
// skip rows marking end of table, reset the current table
if (currentLine.StartsWith("@EndTable", StringComparison.OrdinalIgnoreCase))
{
currentTable = null;
continue;
}
// initialize a new table
if (currentLine.StartsWith("@Table", StringComparison.OrdinalIgnoreCase))
{
currentTable = new DataTable();
tables.Add(currentTable);
// initialise the columns
var columns = reader.ReadLine().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var column in columns)
currentTable.Columns.Add(column, typeof(String));
continue;
}
if (currentTable == null) continue; // file is not in the format we were expecting
// add data row
var dataRow = currentTable.NewRow();
dataRow.ItemArray = currentLine.Split(new char[] { ';' });
currentTable.Rows.Add(dataRow);
}
}
return tables;
}
然后可以从按钮单击事件处理程序中使用此方法,如下所示;
var tables = ReadDataTables(fileName);
dataGridView1.DataSource = tables[0];
dataGridView2.DataSource = tables[1];
dataGridView3.DataSource = tables[2];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.