将包含DataRow对象的ArrayList绑定到DataGridView.DataSource

问题描述:

我试图将项目从ArrayList称为duplicatesDataGridView。但它不显示来自ArrayListItemArray的数据,这是我想要的,而是显示元数据。将包含DataRow对象的ArrayList绑定到DataGridView.DataSource

duplicatesArrayList类型:

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

结果

Results I get

Results I require To be displayed

+0

请勿发布图片。不是每个人都可以看到它们,这使我们很难帮助你...意味着你不太可能得到一个好的答案。将这些图像转换为文本块。 –

+0

另外...发布FindDuplicates()方法将有所帮助。 –

您试图显示一个ArrayList,其中包含一些DataRow对象,而DataGridView显示DataRow的属性。它是预期的。

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

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

这里的区别是,DataGridView显示DataTable这是DataView类型它实现ITypedListDefaultView属性。因此,它显示了GetItemProperties返回的内容,实际上是从DataTable询问的,它是表列的列表。

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

只需将它们添加到具有相同原始表格架构的表格即可。对于examle:

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。您有不同的选项,例如使用Clone方法DataTable创建具有相同架构的空DataTable,使用Copy方法创建数据和架构副本,使用AsDataViewAsEnumerableAsEnumerable().CopyToDataTable()等执行一些搜索。

+0

我完全了解它,并一直致力于修复错误,现在它可以工作。对不起,迟到的答复和谢谢。 –

+0

太棒了!别客气 :) –

至于我可以看到你想要这些号码绑定到DataGridView。你正在做的是将一个数组列表绑定到一些对象上,这些对象拥有这个数组作为成员,这就是datagridview显示的内容。

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

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

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

如果将FindDuplicates()方法更改为返回带有实型的强类型List<T>,则此问题消失。然后DataGridView具有它可以查看的实际属性以知道要创建的列。

ArrayLists已死亡。你应该几乎不会在新代码中使用它们。即使您合法地无法找到与List<T>一起使用的真实类型,但与ArrayList相比,List<Object>仍然是更好的选择,因为它向维护人员传达基础对象类型实际上是您想要的,并且它为您提供了更轻松如果您将来能够获得更强大的类型(如界面),则可以改变。