【问题标题】:Use DataGridView.SelectedRows as DataSource for another DataGridView使用 DataGridView.SelectedRows 作为另一个 DataGridView 的数据源
【发布时间】:2015-06-11 09:26:11
【问题描述】:

我想使用用户从一个 DataGridView 中选择的行作为第二个 DataGridView 的数据源。请注意,两个 DataGridView 将具有相同的列。

显然,我可以遍历选定的行,获取键值,然后重新查询数据库以获取列表以用作第二个网格的数据源,但这似乎很蹩脚。

肯定有一种优雅的方式可以简单地将 SelectedRows 集合重新用作数据源?

【问题讨论】:

  • SelectedRows 是一个没有通知的简单集合(与BindingSource 相比),因此无论如何您都必须在事件发生变化时处理事件(由DataGridView 上升)以至少更新@ 987654324@.

标签: c# winforms datagridview


【解决方案1】:

您不能直接将DataRow的集合设置为数据源,您可以从MSDN阅读更多详细信息

做(有点)传统方式怎么样?

var dt = ((DataTable)dataGrid1.DataSource).Clone();

foreach (DataGridViewRow row in dataGrid1.SelectedRows)
{
     dt.ImportRow(((DataTable)dataGrid1.DataSource).Rows[row.Index]);
}

dt.AcceptChanges();

dataGrid2.DataSource = dt;

【讨论】:

  • 如果您已经拥有来自DataGridViewRowDataRow 对象作为dt.ImportRow((DataRow)row.DataBoundItem);,为什么还要使用索引?
【解决方案2】:

使用CopyToDataTable method 的另一种方法。

DataTable dtable2;
DataRow[] rowArray = dataGridView1.SelectedRows;
If !(rowArray.Length == 0 )
{
    dTable2 = rowArray.CopyToDataTable();
}

dataGrodView2.DataSource = dTable2;

【讨论】:

  • 我得到:无法将类型“System.Windows.Forms.DataGridViewSelectedRowCollection”隐式转换为“System.Data.DataRow[]”
  • 抱歉,我们的时区似乎不同。好吧,你可以做一个cast。刚刚更新了我的答案,你也已经有了使用 linq 的解决方案 :)
【解决方案3】:

感谢您的回复。好像没有很简单的方法。

我是这样做的:

MyDatGridView.SelectedRows.Cast<DataGridViewRow>().Select(dgvr => (int)dgvr.Cells[0].Value).ToList());

然后我尝试在 .Where 子句中使用带有 .Contains 的结果列表。

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 2011-09-22
    • 2011-01-02
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多