2013-06-05 2 views
2

Я показываю элемент управления DataGridView на моей форме, заполняя его объектом DataTable через свойство управления DataSource. Я установил элемент управления для выбора всей строки, когда он выбран, и включил функцию multiselect. Все это работает плавно.DataGridView с источником данных DataTable: как эффективно извлекать выбранные строки?

Пользователь может выбрать несколько строк и нажать кнопку. Я хочу создать новый объект DataTable с копиями выбранных строк и передать его в Crystal Report.

Есть ли эффективное средство для этого? Кажется, единственный способ - проанализировать новые строки для нового DataTable из выбранных ячеек сетки, что кажется мне относительно нелепым.

+0

Мне интересно, если мое предложение было то, что вы искали. Если нет, сообщите мне с разъяснениями о том, что вы ищете. – Gjeltema

ответ

0

Я нашел, что лучший способ избежать итерации по DataTable, чтобы найти нужные вам строки, - это привязка к DataView. Таким образом, вы можете сортировать и все другие интересные вещи, которые вы любите делать с DataGridView, и все еще можете получить нужные данные без ручного анализа базового DataTable.

Ниже краткий пример, который должен показать вам все, что нужно, чтобы получить DataRow без поиска:

DataGridView dataGridView1 = new DataGridView(); 
DataTable tb = new DataTable(); 
DataView dv = tb.AsDataView(); 
dataGridView1.DataSource = dv; 
// Get the row indexes in whatever your favorite manner is. 
List<int> selectedRowIndexes = YourGetSelectedRowIndexesMethod(); 
foreach(int selectedRowIndex in selectedRowIndexes) 
    DataRow dr = dv[selectedRowIndex].Row; 

Один быстрый метод, чтобы получить выбранные индексы (только в случае, если вам это нужно):

List<int> indexes = new List<int>(); 
foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
{ 
    indexes.Add(row.Index); 
} 
+0

@JeremyHolovacs - это сработало для вас? – Gjeltema

+0

@Gjeltama, нет, боюсь, нет. Я получаю разные ошибки, но это, похоже, неэффективно. –

+0

@JeremyHolovacs Мне было бы интересно увидеть ваше текущее решение, которое использует DataTable, что также эффективно. В прошлом мне приходилось делать подобные вещи с помощью DataTable, и вышеупомянутое решение на сегодняшний день является самым простым и эффективным способом, который я нашел. – Gjeltema

1

Это мое решение вопроса «Как получить выбранные строки как DataTable»: структура

  1. копии оригинального DataTable
  2. копия каждая строка (как строка может существовать только в одном DataTable объекта)

    DataTable selectedRows = (sourceDataGridView.DataSource as DataTable).Clone(); 
    
    foreach(DataGridViewRow row in sourceDataGridView.SelectedRows) { 
        selectedRows.Rows.Add((row.DataBoundItem as DataRowView).Row.ItemArray); 
    } 
    
Смежные вопросы