удалить строку DataTable, привязанную к datagridview - PullRequest
0 голосов
/ 09 июля 2020

У меня есть DataTable, привязанный к dataGridView, используя следующий код:

            dataGridView1.DataSource = ReducedColTable;

В какой-то момент я хотел бы переместить выбранные строки в другую таблицу. Итак, вот l oop:

   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 за col.

DataTable dtarget = new DataTable();

Моя проблема в том, что последняя строка удаляет строку из DataGridView, но не из исходной таблицы (ReducedColTable)

Есть какие-нибудь подсказки, как этого добиться?

1 Ответ

1 голос
/ 10 июля 2020

Я обнаружил, что DataTable s ImportRow хорошо подходит для этого. Если вы установите сетку SelectionMode на FullRowSelect, тогда вы сможете пропустить l oop через коллекцию сеток SelectedRows и «импортировать» выбранную строку (строки) в другую DataTable. Ниже приведен простой пример.

dt и dt2 - это два DataTables с похожими схемами. dt - источник данных для datagridview1, а dt2 - источник данных для datagridview2. Изначально dt заполнено некоторыми данными, а dt2 пусто. Как только пользователь выбирает одну или несколько строк, событие нажатия кнопки инициирует перемещение выбранных строк из dt в dt2.

Для начала простой l oop по выбранным строкам. Проверка, выбрана ли «новая строка», которую мы не хотим копировать, поэтому игнорируем ее. Затем получите строку с привязкой к данным из таблицы данных в виде объекта 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);
  }
}

Надеюсь, это поможет.

...