【问题标题】:How to fill an Windows Forms combobox using DbfDotNet?如何使用 DbfDotNet 填充 Windows 窗体组合框?
【发布时间】:2011-01-16 23:04:25
【问题描述】:

我正在尝试使用 DbfDotNet 库 (http://dbfdotnet.codeplex.com) 并替换我当前读取非常大的 dbf 文件(超过 350.000 条记录)的 ADO.NET 方法。 我已经尝试使用现有示例来读取我的文件并归档他们的自定义 Dataview,我对速度印象非常深刻。 在我的原始代码中,我使用 dbf 文件的内容填充数据表,并使用 LINQ 查询来填充我的组合框。

我尝试重写 m LINQ 查询以使用 DbfDotNet 表对象来填充我的组合框,但我仍然是 LINQ 的新手,无法让它工作。

有人可以帮帮我吗?

这是我当前的代码:

var distinctPostalCodes =(来自 this.fileContent.AsEnumerable() 中的行 选择新的 { code = row.Field(columnNameCode), name = row.Field(columnNameName) }).OrderBy(x => x.code).Distinct();

this.fileContent 是我的带有地址数据的 DataTable。

【问题讨论】:

    标签: c# winforms linq combobox


    【解决方案1】:
    var distinctPostalCodes = (from row in new DataTable().AsEnumerable()
                                   select new
                                   {
                                       code = row[columnNameCode],
                                       name = row[columnNameName]
                                   }).OrderBy(x => x.code).Distinct();
    

    试试这个,它对我很好,你能告诉我结果或错误吗?

    【讨论】:

    • [] 和 Field() 唯一不同的是最后一个返回的是强类型数据
    • 不,它不会检索强类型对象,选择 new 实际上会检索匿名类型,但是在这种情况下,您将拥有 ienumarable,您可以将其直接绑定到下拉列表中
    【解决方案2】:

    如果问题出在字段类型上,请尝试

    code = row.Field<int>(columnNameCode),
    name = row.Field<string>(columnNameName)
    

    【讨论】:

      【解决方案3】:

      我的原始代码在 AsEnumerable() 上出现编译错误: 实例参数:无法从“DbfDotNet.DbfTable”转换为“System.Data.DataTable” 'DbfDotNet.DbfTable' 不包含 'AsEnumerable' 的定义,并且最佳扩展方法重载 'System.Data.DataTableExtensions.AsEnumerable(System.Data.DataTable)' 有一些无效参数

      今晚我将尝试使用 new DataTable().AsEnumerable() 中的 from row 的建议,但我对该示例有点困惑。 正在使用哪些数据?我的 this.fileContent 从未使用过?

      【讨论】:

        【解决方案4】:

        终于找到了:

                DbfDotNet.Linq.DbfTable<DbfDotNet.DbfRecord> dbftable = new DbfDotNet.Linq.DbfTable<DbfDotNet.DbfRecord>(@"ADRESSER.dbf", System.Text.Encoding.ASCII, DbfDotNet.DbfVersion.dBaseIII);
                // Fill grid:
                dbfTableView1.DbfTable = dbftable;
        
                var distinctPostalCodes = (from row in dbftable.AsEnumerable()
                                           select new
                                           {
                                               code = row.GetField(4),
                                               name = row.GetField(5)
                                           }).OrderBy(x => x.code).Distinct();
        
                this.comboBox1.DataSource = distinctPostalCodes.ToArray();
                this.comboBox1.DisplayMember = "code";
                this.comboBox1.ValueMember = "code";
        

        太糟糕了,当我使用 ADO.NET 时,这段代码现在和以前一样慢;(

        【讨论】:

          猜你喜欢
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-07
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多