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

时间:2013-06-05 13:52:47

标签: c# datagridview crystal-reports datatable dataset

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

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

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

2 个答案:

答案 0 :(得分:1)

这是我对“如何将选定的行作为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);
    }
    

答案 1 :(得分:0)

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