Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

Как скопировать строки из DataGridView?

Создаю другой DataGridView, скопировал массив строк из одного, хочу добавить в другой. Ошибка, надо чтобы столбцы совпадали. Через цикл скопировал название и тип столбцов. Ошибка, такой столбец уже есть (тут уже возникло недоумение). Что только не перепробовал. И в DataView пытался превращать и в DataTable. В общем. Есть одна таблица, заполняемая так:
counterpartyListGV.ReadOnly = false; MDM_DBDataSetTableAdapters.PERSONTableAdapter Ptb = new MDM_DBDataSetTableAdapters.PERSONTableAdapter(); Ptb.Fill(mainForm.MDM_DS.PERSON); var checkBoxColumn = new DataGridViewCheckBoxColumn(); checkBoxColumn.HeaderText = ""; checkBoxColumn.Name = "CheckBoxColumn";
checkBoxColumn.ReadOnly = false; checkBoxColumn.FalseValue = false; checkBoxColumn.TrueValue = true; counterpartyListGV.Columns.Add(checkBoxColumn); for (int i = 1; i < counterpartyListGV.Columns.Count; i++) counterpartyListGV.Columns[i].ReadOnly = true; counterpartyListGV.DataSource = mainForm.MDM_DS.PERSON.DefaultView;
Нужно скопировать те строки, которые отмечены галочкой в первом (дополнительном) столбце.
upd.: Сейчас вот тоже пытаюсь вставить построчно те строки, что отмечины галкой в первом столбце.
DataGridView mergeRows = new DataGridView(); for (int i = 0; i < counterpartyListGV.Rows.Count; i++) if (((DataGridViewCheckBoxCell)counterpartyListGV.Rows[i].Cells[0]).Value != null && (bool)((DataGridViewCheckBoxCell)counterpartyListGV.Rows[i].Cells[0]).Value) { mergeRows.Rows.Add(counterpartyListGV.Rows[i].Cells); }
Но так не работает (мол, нет столбцов в новом DataGridView). Пытаюсь добавить столбцы:
DataGridViewColumn[] a = new DataGridViewColumn[counterpartyListGV.Columns.Count]; counterpartyListGV.Columns.CopyTo(a, 0); mergeRows.Columns.AddRange(a);
Говорит, что "Указанный столбец уже принадлежит к элементу управления DataGridView". Уфф.


Ответ

Одно из основополагающих правил современной разработки - данные должны быть отделены от представления.
У вас данные хранятся в DataTable - вот с ним и нужно работать. А DataGridView - это представление - не трогаем его, просто используем привязку данных.
Я набросал полностью рабочий пример. Данные заносятся в DataTable в коде, а не из БД.
using System; using System.Data; using System.Drawing; using System.Windows.Forms;
namespace WindowsFormsApp1 { public partial class Form1 : Form { DataGridView dataGridView1; DataGridView dataGridView2; DataTable dataTable;
public Form1() { //InitializeComponent(); Size = new Size(400, 400);
dataGridView1 = new DataGridView { Parent = this, Dock = DockStyle.Top }; dataGridView2 = new DataGridView { Parent = this, Dock = DockStyle.Bottom };
// Здесь ваш код чтения данных из БД dataTable = new DataTable(); dataTable.Columns.Add("Id", typeof(int)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Rows.Add(1, "Bob"); dataTable.Rows.Add(2, "Alice");
// Добавляем колонку в источник данных dataTable.Columns.Add("Check", typeof(bool));
// Делаем привязку данных dataGridView1.DataSource = dataTable;
new Button { Parent = this, Top = dataGridView1.Bottom + 10, Text = "Copy" } .Click += ButtonCopy_Click; }
private void ButtonCopy_Click(object sender, EventArgs e) { // Создаём вью var dv = new DataView(dataTable);
// Фильтруем данные во вью dv.RowFilter = "Check = true";
// Делаем привязку данных dataGridView2.DataSource = dv;
// Скрываем колонку, если не нужна dataGridView2.Columns["Check"].Visible = false; } } }
Обратите внимание, все манипуляции осуществляются непосредственно с источником данных - DataTable. Мы практически не касаемся DataGridView

Комментариев нет:

Отправить комментарий