您正在尝试显示包含一些 DataRow 对象的 ArrayList,而 DataGridView 正在显示 DataRow 的属性。意料之中。
但您可能已经注意到,当您在DataGridView 中显示DataTable 时,控件会显示列而不是属性。
为什么?显示DataTable 和显示DataRow 对象列表有什么区别?
区别就在这里,DataGridView 显示了DataTable 的DefaultView 属性,它是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 方法创建数据和架构的副本,使用 AsDataView 和 AsEnumerable 和 AsEnumerable().CopyToDataTable() 执行一些搜索和以此类推。