【问题标题】:Binding an ArrayList containing DataRow objects to DataGridView.DataSource将包含 DataRow 对象的 ArrayList 绑定到 DataGridView.DataSource
【发布时间】:2017-10-11 20:09:38
【问题描述】:

我正在尝试将名为 duplicatesArrayList 中的项目绑定到 DataGridView。但是它没有显示来自 ArrayList ItemArray 的数据,这是我想要的,而是显示元数据。

duplicatesArrayList 类型:

duplicates = compare.FindDuplicates(existingLeadFilePath, newLeadFilePath);
gridViewMain.DataSource = duplicates;

结果

【问题讨论】:

  • 不要发布图片。不是每个人都能看到它们,这让我们更难帮助你……这意味着你不太可能得到一个好的答案。将这些图像转换为文本块。
  • 另外...发布 FindDuplicates() 方法会有所帮助。

标签: c# .net winforms arraylist datagridview


【解决方案1】:

您正在尝试显示包含一些 DataRow 对象的 ArrayList,而 DataGridView 正在显示 DataRow 的属性。意料之中。

但您可能已经注意到,当您在DataGridView 中显示DataTable 时,控件会显示列而不是属性。

为什么?显示DataTable 和显示DataRow 对象列表有什么区别?

区别就在这里,DataGridView 显示了DataTableDefaultView 属性,它是DataView 的类型,它实现了ITypedList。所以它显示了 GetItemProperties 返回的内容,实际上是从 DataTable 询问的,它是一个表格列的列表。

如何在DataGridView 中显示DataRow 对象的列表?

只需将它们添加到与原始表具有相同架构的表中即可。例如:

private void Form1_Load(object sender, EventArgs e)
{
    var originalTable = new DataTable();
    originalTable.Columns.Add("C1");
    originalTable.Columns.Add("C2");

    //Original data
    originalTable.Rows.Add("A", "B");
    originalTable.Rows.Add("X", "Y");
    originalTable.Rows.Add("A", "B");
    originalTable.Rows.Add("X", "Y");

    //An ArrayList containing duplicate DataRow objects
    var duplicates = new System.Collections.ArrayList();
    duplicates.Add(originalTable.Rows[2]);
    duplicates.Add(originalTable.Rows[3]);

    //Create a Table having the same schema of the original table
    var duplicatesTable = originalTable.Clone();

    //Add copy of duplicates to the duplicate table
    foreach (DataRow item in duplicates)
    {
        duplicatesTable.Rows.Add(item.ItemArray);
    }
    this.dataGridView1.DataSource = duplicates;
}

注意

在使用DataTable 时,您不需要使用ArrayList。您有不同的选项,例如使用 DataTable 的 Clone 方法创建具有相同架构的空 DataTable,使用 Copy 方法创建数据和架构的副本,使用 AsDataViewAsEnumerableAsEnumerable().CopyToDataTable() 执行一些搜索和以此类推。

【讨论】:

  • 我完全明白了,并且一直在努力修复错误,现在它可以工作了。抱歉回复晚了,谢谢。
【解决方案2】:

据我所知,您希望将这些数字绑定到 datagridview。您正在做的是将数组列表与一些具有您想要作为成员的数组的对象绑定,这就是 datagridview 显示的内容。

尽量不要使用包含 5 个项目的数组,而是使用包含 5 个成员的类,然后使用这些对象的列表作为数据源。

扩展教程可以在这里找到:http://www.c-sharpcorner.com/article/binding-an-arraylist-with-datagrid-control/

请原谅我的英语不好,我是用手机写的。

【讨论】:

    【解决方案3】:

    如果您将FindDuplicates() 方法更改为返回一个带有真实类型的强类型List<T>,这个问题就会消失。然后 DataGridView 具有实际属性,它可以查看以了解要创建哪些列。

    ArrayList 已死。您几乎不应该在新代码中使用它们。即使您合法地找不到与List<T> 一起使用的真实类型,List<Object> 仍然是比ArrayList 更好的选择,因为它向维护者传达基本 Object 类型确实是您想要的,并且如果您将来能够获得更强大的类型(如接口),它会让您更轻松地进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多