На форме есть dataGridView1 и dataGridView2. При запуске формы dataGridView1 заполняется тремя столбцами из файла mdb. dataGridView2 пустой. Подскажите пожалуйста, как с помощью левой клавиши мыши перетаскивать с копированием выбранную строку из dataGridView1 в dataGridView2? Начало кода ниже.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace test
{
public partial class Form1 : Form
{
private OleDbConnection conn;
private OleDbConnectionStringBuilder sb;
public Form1()
{
InitializeComponent();
sb = new OleDbConnectionStringBuilder();
sb.Provider = "Microsoft.Jet.OLEDB.4.0";
sb.DataSource = @"c:\base.mdb";
conn = new OleDbConnection(sb.ConnectionString);
this.dataGridView1.DataSource = FillTable("SELECT * FROM СПИСОК");
}
private DataTable FillTable(String sql)
{
DataTable table = new DataTable();
using (OleDbDataAdapter da = new OleDbDataAdapter(sql, conn))
{
da.Fill(table);
}
return table;
}
private void Form1_Load(object sender, EventArgs e)
{
this.dataGridView1.Columns[0].HeaderText = "1";
this.dataGridView1.Columns[1].HeaderText = "2";
this.dataGridView1.Columns[2].HeaderText = "3";
this.dataGridView2.ColumnCount = 3;
this.dataGridView2.ColumnHeadersVisible = true;
this.dataGridView2.Columns[0].HeaderText = "1";
}
}
}
Перетаскивание мышкой называется drag and drop.
Так как у вас первый грид привязан к DataTable, то и для второго грида создадим дататейбл с такими же колонками:
DataTable table; // поле формы
DataTable table2; // поле формы
Обратите внимание, первый дататейбл тоже делаем полем формы, чтобы к нему можно было обращаться из других методов.
Эти строки должны быть в вашем методе FillTable, перед return:
table = new DataTable(); // теперь это не локальная переменная!
// тут заполнение
table2 = table.Clone();
dataGridView2.DataSource = table2;
Задайте второму гриду свойство, разрешающее ему принимать данные:
dataGridView2.AllowDrop = true;
Подпишите гриды на события:
dataGridView1.CellMouseMove += DataGridView1_CellMouseMove;
dataGridView2.DragOver += DataGridView2_DragOver;
dataGridView2.DragDrop += DataGridView2_DragDrop;
Код в обработчиках этих событий:
private void DataGridView2_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(DataRow)))
{
var row = (DataRow)e.Data.GetData(typeof(DataRow));
table2.ImportRow(row);
}
}
private void DataGridView2_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(DataRow)))
{
e.Effect = DragDropEffects.Copy;
}
}
private void DataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.RowIndex >= 0 && e.RowIndex < table.Rows.Count)
{
//dataGridView1.DoDragDrop(table.Rows[e.RowIndex], DragDropEffects.Copy);
dataGridView1.DoDragDrop(table.DefaultView[e.RowIndex].Row, DragDropEffects.Copy);
}
}
Собственно, этого кода достаточно для реализации драг-дропа. Но, по-хорошему, нужно добавить обработку исключений и т. п.
Выяснилось, что, если в DataGridView включена сортировка, то индекс отображаемой строки грида может не соответствовать индексу строки в DataTable. Поэтому нужно брать строку из DataView.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости