【问题标题】:delete a DataTable row bound to a datagridview删除绑定到 datagridview 的 DataTable 行
【发布时间】:2020-10-30 13:04:40
【问题描述】:

我有一个DataTable 使用以下代码绑定到dataGridView

            dataGridView1.DataSource = ReducedColTable;

有时我想将选定的行移动到另一个表中。 所以这里是循环:

   List<DataGridViewRow> rows = (from DataGridViewRow row in dataGridView1.SelectedRows
                                      where !row.IsNewRow
                                      orderby row.Index
                                      select row).ToList<DataGridViewRow>();
        foreach (DataGridViewRow item in rows)
        {
            DataRow newRow = dtarget.Rows.Add();
            newRow.SetField("artiste", item.Cells[0].Value);
            newRow.SetField("album", item.Cells[1].Value);
            newRow.SetField("song", item.Cells[2].Value);
            newRow.SetField("year", item.Cells[3].Value);
            newRow.SetField("file_path", item.Cells[4].Value);
            newRow.SetField("file_size", item.Cells[5].Value);
            dataGridView1.Rows.RemoveAt(item.Index);
        }

Ps:我没有找到将行复制到全局声明的新表 (dtarget) 的方法,因此方法 col by col。

DataTable dtarget = new DataTable();

我的问题是最后一行是从 DataGridView 中删除该行,但不是从原始表中删除 (ReducedColTable)

任何提示如何实现这一点?

【问题讨论】:

  • 从数据源(您的数据表)中删除记录(行)。如果您需要一个与原始数据表相同的数据表,那么 Clone() 原始数据表。您可以获取一个 DataRow 对象并将其复制到克隆的 DataTable 中。
  • 好吧,我想要的是能够将行从原始移动到目标,所以克隆不会正常工作?
  • 您克隆一个 DataTable 以拥有一个具有相同结构(和约束)的对象。然后,您可以在需要时将 DataRow 从原始 DT 复制/移动到克隆。与删除 DataRow 无关,您仍然需要将其从 DataSource 中删除,而不是从 Control 中删除。
  • 好的,谢谢,我会试试这个,以避免用 col 填充目标 dt col。谢谢

标签: c# winforms datatable datagridview


【解决方案1】:

我发现DataTableImportRow 很适合这个。如果您将网格SelectionMode 设置为FullRowSelect,那么您应该能够遍历网格SelectedRows 集合并将选定的行“导入”到另一个DataTable。下面是一个简单的例子。

dtdt2 是两个具有相似架构的 DataTablesdtdatagridview1 的数据源,dt2datagridview2 的数据源。最初,dt 填充了一些数据,dt2 为空。一旦用户选择了一行或多行,按钮的点击事件就会启动将选定行从dt 移动到dt2

首先,一个简单的循环遍历选定的行。检查是否选择了我们不想复制的“新行”,因此我们忽略它。接下来,以DataRowView 对象的形式从数据表中获取“数据绑定”行。然后我们将该行“导入”到dt2,最后从dt 中删除复制的行。我没有对此进行大量测试,但它似乎按预期工作。

private void button1_Click(object sender, EventArgs e) {
  DataRowView drv;
  foreach (DataGridViewRow row in dataGridView1.SelectedRows) {
    if (!row.IsNewRow) {
      drv = (DataRowView)row.DataBoundItem;
      dt2.ImportRow(drv.Row);
      dt.Rows.Remove(drv.Row);
    }
  } 
}

要使示例完整,请将两个网格和按钮放到一个表单上。

DataTable dt;
DataTable dt2;

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  dt = GetTable();
  dt2 = GetTable();
  FillTable(dt);
  dataGridView1.DataSource = dt;
  dataGridView2.DataSource = dt2;
}

private DataTable GetTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Col1", typeof(string));
  dt.Columns.Add("Col2", typeof(string));
  dt.Columns.Add("Col3", typeof(string));
  return dt;
}

private void FillTable(DataTable dt) {
  for (int i = 0; i < 10; i++) {
    dt.Rows.Add("C0R" + i, "C1R" + i, "C2R" + i);
  }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2020-03-13
    • 2010-11-28
    相关资源
    最近更新 更多