TheRealProgrammer Ответов: 2

Экспорт datagridview selectedrows в datatable не будет работать


Привет. Я хочу экспортировать все выбранные строки из datagridview в DataTable. При щелчке (выборе) более чем на 2 строках появляется следующая ошибка:

- Исключение.Рор системы типа.IndexOutOfRangeException произошло в System.Data.dll."

Что я уже пробовал:

DataTable table = new DataTable();
            for (int i = 0; i < dataGridView_auswahlen.Rows.Count; i++) {
                if (dataGridView_auswahlen.Rows[i].Selected) {
                    table.Rows.Add( );
                    for (int j = 0; j < dataGridView_auswahlen.Columns.Count; j++) {
                        table.Rows[i][j] = dataGridView_auswahlen[j, i].Value;
                    }
                }
            }

[no name]

"IndexOutOfRangeException" в значительной степени самоочевидно. Итак, в чем именно заключается Ваш вопрос?

#realJSOP

Достоверность вашего идентификатора пользователя сразу же ставится под сомнение.

2 Ответов

Рейтинг:
8

Karthik_Mahalingam

обратитесь встроенных комментариев

DataTable dt = new DataTable(); // create a table for storing selected rows
            var dtTemp = dataGridView1.DataSource as DataTable; // get the source table object
            dt = dtTemp.Clone();  // clone the schema of the source table to new table
            DataTable table = new DataTable();
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                if (dataGridView1.Rows[i].Selected)
                {
                  var row =   dt.NewRow();  // create a new row with the schema 
                  for (int j = 0; j < dataGridView1.Columns.Count; j++)
                    {
                        row[j] = dataGridView1[j, i].Value;
                    }
                  dt.Rows.Add(row);  // add rows to the new table
                }
            }


TheRealProgrammer

Хорошо, я понимаю. Проблема в том, что мне нужно отобразить все строки в моем dataGridView. Из dataGridView я выбираю то, что мне нужно, и то, что я выбрал, должно быть клонировано в DataTable. В этом примере dataGridView покажет только 1 результат, а не весь список.

Рейтинг:
1

OriginalGriff

Почему вы предполагаете, что i действителен для обоих dataGridView_auswahlen (источник строки) и table (пункт назначения строки)?
Поскольку вы переносите только выбранные строки, если только ваш выбор не всегда начинается с первой строки и не имеет пробелов, вы всегда получите исключение.
Вместо использования индекса создайте новую строку с помощью объект DataTable.Невров[^], и добавьте это в свой DataTable. Затем вы можете использовать объект DataRow для добавления значений ячеек.


TheRealProgrammer

Я понимаю, но как я могу это реализовать? Я не могу понять, как я могу интегрировать это в свое "для".

OriginalGriff

Создайте свой DataTable, а затем добавьте столбцы перед циклом " for " - таким образом, Вы сможете дать им имена, которые помогут.
Затем внутри вашего "если" создайте экземпляр DataRow из DataTable и используйте этот экземпляр для установки значений столбцов в цикле, почти так же, как вы делаете это сейчас. Затем добавьте строку в таблицу.

Что в этом сложного? Возможно, я плохо объясняю...