我将一些DataGridView的数据保存到文本文件中(对于我引用每个单元格内容的数据),在TXT文件的最后一行,我存储了dataGridView的行数。在行的开头有一个“ - ”。
现在,我可以将我的数据完美地读入我的DVG,但是如何排除包含行数的最后一行并使用它来读取其存储的int?
我用于将数据读入DVG的代码:
void LoadDVGData()
{
StreamReader sr = new StreamReader(open.FileName);
foreach (DataGridViewRow row in editDGV.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
string content = sr.ReadLine();
cell.Value = content;
}
}
sr.Close();
}
先谢谢。 - CCB
答案 0 :(得分:1)
你只需要保持一个向前看的标记,这样你就可以回答这个问题,“这是最后一行吗?” (如果你有一条当前行,但没有下一行,那么你就位于最后一行。
这是一种方法,可能很简单:
void LoadDVGData()
{
using ( StreamReader sr = new StreamReader(open.FileName) )
{
string currentLine = sr.ReadLine() ;
string nextLine = sr.ReadLine() ;
foreach (DataGridViewRow row in editDGV.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
if ( currentLine == null ) throw new InvalidOperationException("Hmph. We seem to have run out of input data");
cell.Value = currentLine ;
currentLine = nextLine ;
nextLine = sr.ReadLine() ;
} //end cols loop
} // end rows loop
} // end using block
return;
}
答案 1 :(得分:0)
我认为sr
是读取文本文件的StreamReader
- 您应该将其包含在using
或try..finally
块中,以确保在出现错误时进行正确的清理。
对于文本文件与DataGridView
(DGV)中的行数/单元格数不匹配的情况,您当前的设置无法正常工作:您尝试阅读每个单元格的文件中的值,如果指定了错误的文件,您可能会尝试读取超出文件末尾的值。您应该对此代码进行更多错误处理,因为在读取文件期间可能存在各种问题点:行太少,行的单元格太少,特定单元格的值无效等等。
您的设置不适合处理。如果您控制文本文件的格式,我建议更改格式,以便第一行是计数,然后文本文件中的每一行都使用{{1}描述DGV的完整行}作为分隔符。加载这样的文件要简单得多。 (您甚至可以在第一行上拥有行数和列数,以便为您提供有关数据的更多信息;您永远不会有太多关于输入数据的元数据。)
所以你的新文本文件格式如下:
TAB
如果您无法更改文本文件格式,那么只需读取文件两次 - 首先查找文件的末尾并回读到最后一行的末尾 - 然后只读取一行 - 它应该是行数。您可以通过在文件末尾查找换行符来完成此操作。然后只需寻找文件的开头并从中读取这么多行。
修改强>
正如@vesan在问题中评论的那样,如果您的输入文件不是很大,您只需拨打3{TAB}5
R1C1{TAB}R1C2{TAB}R1C3{TAB}R1C4{TAB}R1C5{CRLF}
R2C1{TAB}R2C2{TAB}R2C3{TAB}R2C4{TAB}R2C5{CRLF}
R3C1{TAB}R3C2{TAB}R3C3{TAB}R3C4{TAB}R3C5{CRLF}
即可获得File.ReadAllLines()
中的所有行。然后处理它是微不足道的。但是,对于任何文件大小,使用更方便的文件格式都可以。读取所有行假定输入文件不是很大。
编辑2:
例如(为简洁省略了错误处理):
string[]
如果你的文字文件是正确的,var sLines = File.ReadAllLines ( open.FileName );
var nRowCount = int.Parse ( sLines[sLines.Length - 1] );
var nIndex = 0;
foreach (DataGridViewRow row in editDGV.Rows)
{
foreach (DataGridViewCell cell in row.Cells)
{
cell.Value = sLines[nIndex];
nIndex++;
}
}
将有正确的行数,你永远不会真正读取数组的最后一个元素到DGV。