【问题标题】:DataGridView with DataTable data source: how to efficiently extract selected rows?DataGridView 与 DataTable 数据源:如何有效地提取选定的行?
【发布时间】:2013-06-01 06:20:54
【问题描述】:

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

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

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

【问题讨论】:

  • 我很好奇我的建议是否是您想要的。如果没有,请告诉我您要查找的内容。

标签: c# datagridview crystal-reports datatable dataset


【解决方案1】:

这是我对“如何将选定的行作为数据表”的问题的解决方案:

  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);
    }
    

【讨论】:

    【解决方案2】:

    我发现避免遍历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);
    }
    

    【讨论】:

    • @Gjeltama,不,恐怕不是。我得到不同的错误,但这似乎并没有更有效。
    • @JeremyHolovacs 我很想知道您当前使用DataTable 的解决方案同样有效。过去我不得不用DataTable 做类似的事情,而上述解决方案是迄今为止我发现的最简单和最有效的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多