Я обнаружил, что 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);
}
}
Надеюсь, это поможет.