我在我的表单上显示一个控件,通过控件的属性用一个对象DataGridView
填充它。我将控件设置为在选中时选择整行,并启用多选。所有这些都很顺利。 DataTable
DataSource
用户可以选择多行并单击一个按钮。我想DataTable
用所选行的副本创建一个新对象并将其传递给 Crystal Report。
有没有一种有效的方法来做到这一点?似乎唯一的方法是DataTable
从选定的网格单元中解析新行的新行,这让我觉得相对荒谬。
我在我的表单上显示一个控件,通过控件的属性用一个对象DataGridView
填充它。我将控件设置为在选中时选择整行,并启用多选。所有这些都很顺利。 DataTable
DataSource
用户可以选择多行并单击一个按钮。我想DataTable
用所选行的副本创建一个新对象并将其传递给 Crystal Report。
有没有一种有效的方法来做到这一点?似乎唯一的方法是DataTable
从选定的网格单元中解析新行的新行,这让我觉得相对荒谬。
这是我对“如何将选定的行作为数据表”问题的解决方案:
复制每一行(因为一行可能只存在于一个数据表对象中)
DataTable selectedRows = (sourceDataGridView.DataSource as DataTable).Clone();
foreach(DataGridViewRow row in sourceDataGridView.SelectedRows) {
selectedRows.Rows.Add((row.DataBoundItem as DataRowView).Row.ItemArray);
}
我发现避免遍历DataTable
以查找所需行的最佳方法是绑定到 a 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);
}