注意:下面列出的一些代码已经用于我的一些其他问题,但涉及其他问题。我还编辑了大部分帖子,以减少混淆!
我最初包含了MessageBox.Show(),以查看记录是否已正确循环并显示在字段中,但之后是否已将其删除。例如,如果我打开一个文件,MessageBox.Show()将出现,显示第一条记录,再次选择OK按钮,显示第二条记录,依此类推。取而代之的是,我希望每一行都充当MessageBox.Show()并正确显示相关行 - 即记录号为4,记录4显示。我可以读取文件中的X记录数量,我知道如何在DataGridView表中创建X量的记录。 什么应该发生:
我在下面有一个DataGridView SelectionChanged方法,它只获取我选择的行号。我考虑将数字传递给我的ReadWeldRecs方法:
private void Dgv_SelectionChanged(object sender, EventArgs e)
{
int rec_num_to_read = Dgv.CurrentRow.Index + 1;
ReadWeldRecs(rec_num_to_read);
}
目前,即使我只是尝试FileStream.Seek在我打开的文件中的位置与上面的行值,它崩溃。所以,我删除了while循环,数据返回空白(根本不读)。
private void ReadWeldRecs(int row_to_read)
{
byte[] Rec = new byte[1024];
int length = Rec.Length;
using (FileStream Fs = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
using(BinaryReader Br = new BinaryReader(Fs))
{
while ((length = Br.Read(Rec, 0, 1024)) > 0) // IF I REMOVE THIS IT DOESN'T CRASH BUT IT DOESN'T READ ANY DATA AND COMES BACK BLANK
{
Fs.Seek(row_to_read * 1024, SeekOrigin.Begin);
// Rest of code to read file information...
}
}
}
我现在可以激活方法,当选择一行时从文件中读取数据,但数据是错误的 - 有些但是很少:/
private void Dgv_SelectionChanged(object sender, EventArgs e)
{
byte[] Rec = new byte[1024];
long length = file_info.Length;
int rec_num_to_read = Dgv.CurrentRow.Index + 1;
using (FileStream Fs = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader Br = new BinaryReader(Fs))
{
while ((length = Br.Read(Rec, 0, 1024)) > 0)
{
foreach (var rec in Rec)
{
Fs.Seek(rec_num_to_read * 1024, SeekOrigin.Begin); // Position file to record
Label_Product1.Text = DecodeString(Rec, 3, 12);
}
}
}
}
答案 0 :(得分:0)
以下代码确实有效,但速度很慢:/所以我正在尝试解决它以提高速度。
byte[] Rec = new byte[1024];
FileInfo file_info = new FileInfo(import.FileName);
long a = file_info.Length;
int rec_num_to_read = Dgv.CurrentRow.Index + 1;
using (FileStream Fs = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader Br = new BinaryReader(Fs))
{
while ((a = Br.Read(Rec, 0, 1024)) > 0)
{
Fs.Seek(rec_num_to_read * 1024, SeekOrigin.Begin); // I moved this out of the foreach loop
foreach (var rec in Rec)
{
Label_Product1.Text = DecodeString(Rec, 3, 12);
// Some more info to decode
}
}
}