读取在DataGridView表中选择的记录,并将该记录的信息读入表中未显示的字段

时间:2014-02-25 12:02:23

标签: c# winforms visual-studio datagridview .net-3.5

注意:下面列出的一些代码已经用于我的一些其他问题,但涉及其他问题。我还编辑了大部分帖子,以减少混淆!

我最初包含了MessageBox.Show(),以查看记录是否已正确循环并显示在字段中,但之后是否已将其删除。例如,如果我打开一个文件,MessageBox.Show()将出现,显示第一条记录,再次选择OK按钮,显示第二条记录,依此类推。取而代之的是,我希望每一行都充当MessageBox.Show()并正确显示相关行 - 即记录号为4,记录4显示。我可以读取文件中的X记录数量,我知道如何在DataGridView表中创建X量的记录。 什么应该发生:

  • 用户打开文件
  • 数据摘要填充在DataGridView表
  • 选中的每一行都会在字段中更详细地显示数据。

我在下面有一个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);
            }
        }
    }
}

1 个答案:

答案 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
        }
    }
}