DataGridView与DataTable数据源:如何有效地提取选定的行

本文关键字:提取 有效地 DataTable 数据源 DataGridView | 更新日期: 2023-09-27 18:16:57

我在我的表单上显示了一个DataGridView控件,通过控件的DataSource属性填充它与DataTable对象。我将控件设置为在选中整行时选择该行,并启用了多选。所有这些都很顺利。

用户可以选择多行并单击一个按钮。我想用所选行的副本创建一个新的DataTable对象,并将其传递给Crystal Report。

是否有一种有效的方法来做到这一点?似乎唯一的方法是从选定的网格单元格中解析新的DataTable的新行,这让我觉得相对荒谬。

DataGridView与DataTable数据源:如何有效地提取选定的行

这是我的问题的解决方案"如何获得选定的行作为数据表":

  1. 复制原DataTable结构
  2. 复制每一行(因为一行只能存在于一个数据表对象中)

    DataTable selectedRows = (sourceDataGridView.DataSource as DataTable).Clone();
    foreach(DataGridViewRow row in sourceDataGridView.SelectedRows) {
        selectedRows.Rows.Add((row.DataBoundItem as DataRowView).Row.ItemArray);
    }
    

我发现避免在DataTable上迭代以找到您想要的行的最佳方法是绑定到DataView。通过这种方式,您可以对DataGridView进行排序和所有其他有趣的事情,并且仍然可以在不手动解析底层DataTable的情况下获得所需的数据。

下面是一个简洁的示例,它应该向您展示无需搜索即可获得DataRow所需的一切:

DataGridView dataGridView1 = new DataGridView();
DataTable tb = new DataTable();
DataView dv = tb.AsDataView();
dataGridView1.DataSource = dv;
// Get the row indexes in whatever your favorite manner is.
List<int> selectedRowIndexes = YourGetSelectedRowIndexesMethod();
foreach(int selectedRowIndex in selectedRowIndexes)
    DataRow dr = dv[selectedRowIndex].Row;

获取所选索引的一种快速方法(以防需要):

List<int> indexes = new List<int>();
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
    indexes.Add(row.Index);
}