Копирование строк из dataGridView1 в dataGridView2

283
15 июня 2018, 03:30

На форме есть 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";
        }
        }
    }
Answer 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.

READ ALSO
C# вк код подтверждения

C# вк код подтверждения

После ввода паролья и логина приходит сообщение с Код подтверждения входа от администрации вк а как сделать поля для в вода этого кода ?

267
Как быстро загрузить список сообщений с почтового сервера?

Как быстро загрузить список сообщений с почтового сервера?

Занимаюсь разработкой почтового клиента под ОС Андроид с помощью C# и Xamarin FormsРабота с сервером и протокол реализован, однако при создании...

264
Как использовать Instagram API в ASP.NET MVC?

Как использовать Instagram API в ASP.NET MVC?

При использовании Facebook API проблем не возникло - я просто передавал необходимые запросы в готовые методы, и метод возвращал jsonobject который я конвертил...

416
Выбор if else внутри конструктора

Выбор if else внутри конструктора

Нужно в конструкторе присвоить полям класса определенные значения и реализовать выбор присваиваемого значения на основе данных пользовательского...

304