C# 验证要从.BIN文件添加到DataGridView的潜在新行 忽略/跳过第一条常量记录,该记录包含店铺id、位置和打开日期等信息。。。阅读其余信息(如购买id、商品名称、购买日期等信息)。。。

C# 验证要从.BIN文件添加到DataGridView的潜在新行 忽略/跳过第一条常量记录,该记录包含店铺id、位置和打开日期等信息。。。阅读其余信息(如购买id、商品名称、购买日期等信息)。。。,c#,winforms,visual-studio,datagridview,.net-3.5,C#,Winforms,Visual Studio,Datagridview,.net 3.5,我正在创建一个解码.bin文件并将信息显示到DataGridView表中的应用程序。选择行后,更多信息将显示在其他字段中。但是,不需要的数据总是添加到每个文件的第一行,有时添加到最后一行。我想验证它,并仅在验证通过时显示。我的代码只是添加了一些转换后看到的内容。当用户选择要导入的文件时,将调用方法Info_to_表 byte[] rec_arr = new byte[32767]; private void Info_to_Table() { rec_arr = File.ReadAll

我正在创建一个解码.bin文件并将信息显示到DataGridView表中的应用程序。选择行后,更多信息将显示在其他字段中。但是,不需要的数据总是添加到每个文件的第一行,有时添加到最后一行。我想验证它,并仅在验证通过时显示。我的代码只是添加了一些转换后看到的内容。当用户选择要导入的文件时,将调用方法Info_to_表

byte[] rec_arr = new byte[32767];
private void Info_to_Table()
{
    rec_arr = File.ReadAllBytes(import.FileName);
    FileInfo fi = new FileInfo(import.FileName);
    long length = fi.Length;
    long count = 0;

    using (FileStream Fs = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
    using (BinaryReader Br = new BinaryReader(Fs))
    {
        // Read other info here

        while ((length = Br.Read(rec_arr, (int)0, 1024)) > 0) *
        {
            // Read other info here
            Dgv.Rows.Add(DecodeLong(rec_arr, 4), count++, DecodeDateTime(rec_arr, 28));
        }

        Br.Close();
        Fs.Close();
    }
}
选择记录(行)时:

private void Dgv_SelectionChanged(object sender, EventArgs e)
{
    To_Fields();
}
private void To_Fields()
{           
    rec_arr = File.ReadAllBytes(import.FileName);
    FileInfo file_info_bin = new FileInfo(import.FileName);
    long length_bin = file_info_bin.Length;
    int rec_num_to_read = Dgv.CurrentRow.Index;

    using (FileStream FS = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
    using (BinaryReader BR = new BinaryReader(FS))
    {
        do
        {
            FS.Seek(rec_num_to_read * 1024, SeekOrigin.Begin);
            // Read other info here!
            Status(rec_arr);

            foreach (var rec in rec_arr)
            {
                rec_num_to_read++;
            }
        }
        while ((length_bin = BR.Read(rec_arr, 0, 1024)) > 0);

        BR.Close();
        FS.Close();
    }
}
每次选择记录时:

private void Dgv_SelectionChanged(object sender, EventArgs e)
{
    To_Fields();
}
private void To_Fields()
{           
    rec_arr = File.ReadAllBytes(import.FileName);
    FileInfo file_info_bin = new FileInfo(import.FileName);
    long length_bin = file_info_bin.Length;
    int rec_num_to_read = Dgv.CurrentRow.Index;

    using (FileStream FS = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
    using (BinaryReader BR = new BinaryReader(FS))
    {
        do
        {
            FS.Seek(rec_num_to_read * 1024, SeekOrigin.Begin);
            // Read other info here!
            Status(rec_arr);

            foreach (var rec in rec_arr)
            {
                rec_num_to_read++;
            }
        }
        while ((length_bin = BR.Read(rec_arr, 0, 1024)) > 0);

        BR.Close();
        FS.Close();
    }
}
在填充表之前,是否有方法验证文件信息?忽略任何错误都是不对的?如果第一列的数字大于22500,则整行都是错误的

它现在所做的,这是错误的:

我希望它做什么,这是正确的:

文件中的每条记录长度为1024个字符。我认为解决方案应该与*一致,因为这里我从流中读取字节,索引是数组中的起点。字节[],索引,计数

通常,这些文件看起来像这样,并且都具有相同的结构:(包含682条记录的大文件)


由于您没有提供所处理数据的任何描述,因此很难找到比这更好的方法:

while ((length = Br.Read(rec_arr, (int)0, 1024)) > 0) *
{
    // Read other info here
    var foo = DecodeLong(rec_arr, 4);

    if (foo != 825045041)
        Dgv.Rows.Add(foo, count++, DecodeDateTime(rec_arr, 28));
}
To_Fields
方法中,您可以跳过一条记录:

int rec_num_to_read = Dgv.CurrentRow.Index + 1;

然而,我试图用截图中的数据运行代码,但没有成功。我跳过了1024个字节(不需要的记录),从下一条记录的开头得到的内容似乎也无效。值是542966816,日期很乱。我不知道日期的格式,但很明显是出了什么问题

我没有足够的声誉来发布图片,所以这里有一个链接:


我想补充一点,有几种说法是无用的

您不需要调用
Close()
,这就是使用
的目的

如果没有您遗漏的代码,则其他备注是正确的

读取是在循环中完成的,因此不需要
ReadAllBytes

rec_arr = File.ReadAllBytes(import.FileName);
长度
也不使用

FileInfo fi = new FileInfo(import.FileName);
long length = fi.Length;


还有一件事,
long
是C#中的64位。使用32位的
int
。因此,最好将
DecodeLong
重命名为
DecodeInt32
,因为这真的很让人困惑。

您是否尝试过调试并查看不需要的数据的来源和原因?当您在同一个文件上运行代码时,结果是不同的?您可以将完整代码发布到Dgv填充的位置吗?我们对您的数据了解不够,无法帮助您进行验证。这两个可疑行的日期也可以追溯到20世纪90年代。我尝试了您的解决方案,尽管它正确地显示了正确数量的记录,但功能仍然相同。当我选择第一条记录为1时,它表示字段中的数字是825041。。。选择记录2表示字段中的数字为1。这有点难以解释,但已经解释了一半。我在使用的.bin文件中包含了一个数据截图,希望能有所帮助。第二行应该是什么值和日期?我在to_Fields方法中添加了这一行,这很简单但很天才!我不知道为什么我从没想过,哦,不!谢谢!:)不客气!但这不是一般的解决办法。如果文件中间有一个无效的记录,所有的问题都会出错。虽然它解决了第一行的问题,但是当相同的值有时只出现在最后一个记录中时呢?基本上,如果最后一个'foo'等于825041,则不添加该行。这种情况并非总是发生,但有时会发生:/