Datagridview - копировать выбранные ячейки в новую таблицу данных - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужно экспортировать данные из DataGridView в Excel, но только выбранные ячейки. DataGridView привязан к DataTable. Я видел много примеров того, как копировать выбранные строки, но не могу найти, как копировать только выбранные ячейки в новый DataTable. Это то, что я пробовал до сих пор:

  //First, copy structure of DataTable into new one
  DataTable dt = ((DataTable)dgv.DataSource).Clone();

  //Then insert data into new datatable
  foreach (DataGridViewCell cell in dgv.SelectedCells)
  {
    //We get Index of column and row from bounded DataTable 
     int col_indx = ((DataTable)dgv.DataSource).Columns.IndexOf(dgv.Columns[cell.ColumnIndex].Name);
     int row_indx = ((DataTable)dgv.DataSource).Rows.IndexOf(((DataRowView)dgv.Rows[cell.RowIndex].DataBoundItem).Row);

  //First check if row already exists
  if (dt.Columns.Contains(dgv.Columns[cell.ColumnIndex].Name))
            {
                DataRow newrow = dt.NewRow();
                newrow[col_indx] = cell.Value;
                dt.Rows.InsertAt(newrow, row_indx);
            }
            else
            {
               dt.Rows[row_indx][cell_indx] = cell.Value;
            }    

  }
   dt.AcceptChanges();

Эта часть вставляет данные в новую таблицу данных, но в отдельных строках, если я выбираю несколько ячеек из той же строки. Как я могу это исправить?

EDIT:

 for (int i = 0; i < dgv.Rows.Count; i++)
 {
     dt.Rows.Add();
     for (int j = 0; j < dgv.ColumnCount; j++)
     {
        if (dgv.Rows[i].Cells[j].Selected == true)
        {
           dt.Rows[i][j] = dgv.Rows[i].Cells[j].Value;
        }
     }
  }
   dt.AcceptChanges();

Это самое близкое, чего я мог достичь. Он копирует выбранные данные в новый DataTable, но, к сожалению, он также сохраняет пустые строки. Поэтому, когда я выбираю ячейки в Datagridview, например, из 3-я строка, выходные данные в Excel будут с первыми 2 строками пустыми. Я хочу этого избежать, но как? ... Другими словами, то, что я выбираю в Datagridview, должно начинаться в новом Datatable из строки 1 и так далее ...

Ответы [ 3 ]

1 голос
/ 25 апреля 2019

Вы добавляете строку для каждой строки.Вы должны добавить строку для каждой выбранной строки.Попробуйте это

 int k=0;
 bool addRow;
 for (int i = 0; i < dgv.Rows.Count; i++)
 {
     addRow=true;
     for (int j = 0; j < dgv.ColumnCount; j++)
     {
        if (dgv.Rows[i].Cells[j].Selected == true)
        {
            if(addRow){
                dt.Rows.Add();
                addRow=false;
                k++;
            }
            dt.Rows[k-1][j] = dgv.Rows[i].Cells[j].Value;
        }
     }
  }
   dt.AcceptChanges();
0 голосов
/ 25 апреля 2019

Проблема решена.Это было не легко, хотя.Сначала я должен был создать новый DataTable с той же структурой, что и ограниченный DataTable.Затем скопируйте все выбранные ячейки в эту таблицу данных.И, наконец, я создал новый DataTable только с непустыми строками, используя метод CopyToDataTable, начиная с этого ответа Левитикон .Вот полный код:

//First, copy structure of DataTable into new one
DataTable dt = ((DataTable)dgv.DataSource).Clone();

//Add all selected cells into this DataTable
for (int i = 0; i < dgv.Rows.Count; i++)
 {
     dt.Rows.Add();
     for (int j = 0; j < dgv.ColumnCount; j++)
     {
        if (dgv.Rows[i].Cells[j].Selected == true)
        {
           dt.Rows[i][j] = dgv.Rows[i].Cells[j].Value;
        }
     }
  }
   dt.AcceptChanges();

 // Then create a new DataTable without blank rows
 DataTable final_dt = dt.Rows.Cast<DataRow>()
 .Where(row => !row.ItemArray.All(field => field is DBNull ||
 string.IsNullOrWhiteSpace(field.ToString()))).CopyToDataTable();

Теперь все, что я выбираю в DataGridView get, добавляется в новый DataTable, и как только я экспортирую этот DataTable в Excel, все данные начинаются со строки 0 по желанию.Если кто-нибудь знает лучшее / более короткое решение, пожалуйста, дайте мне знать.

0 голосов
/ 25 апреля 2019

Вы перебираете каждую выбранную ячейку и создаете / вставляете новую строку в указанное row_indx , не проверяя, принадлежат ли ячейки одной и той же строке или нет, и dt уже вставлена ​​строка в row_indx .

Я бы посоветовал проверить, есть ли у вас строка, вставленная в row_indx , если он затем захватывает эту строку и добавляет выбранную ячейку к ней, если это не так затем создайте новую строку и добавьте выбранную ячейку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...