Текущий код работает ... ЕСЛИ DataGridView.AllowUserToAddRows
равен false
!По умолчанию true
.Если сетка позволяет пользователям добавлять строки, код будет зависать в строке…
value = dr.Cells[i].Value.ToString();
при попадании в «новую» строку.Ячейки в «новой» строке: null
, а не DBNull.
. Если вы хотите разрешить пользователю добавлять строки (что, как я полагаю, имеет место, так как код удаляет запятые и новые строки), тогда потребуется кодчтобы проверить эту «новую» строку и игнорировать ее при экспорте сетки.
С учетом сказанного, я полагаю, вы делаете этот путь более сложным, чем это должно быть.Цель состоит в том, чтобы экспортировать ячейки в DataGridView
в файл с разделителями-запятыми (CSV).Это можно сделать с помощью гораздо меньшего количества кода и при этом избегать страшных нулевых значений в ячейках.
С точки зрения файла CSV, если ячейка является «нулевой», это означает, что мы хотим вывести «пустой»”Строка в файл CSV.Это сохранит схему столбца.Поэтому простой двойной цикл по ячейкам сетки - это все, что нужно сделать.При циклическом просмотре ячеек и записи значений в файл необходима простая проверка, прежде чем мы попытаемся захватить ячейки value.ToString()
.Если value
равно нулю, код завершится сбоем, поскольку null
не имеет метода ToString()
.Поэтому, если value
«is» null
, тогда напишите пустую строку в файл… проблема решена!
Поэтому, чтобы помочь, я рекомендую использовать другую стратегию для экспорта ячеек сетки.По-видимому, нет причины для переменной dr
и переменной value
.Кроме того, я бы предположил, что текст ячеек «НЕ» содержит запятые (,).Если вы «знаете», что сетка будет экспортирована в CSV-файл… Я бы установил ячейки сетки так, чтобы пользователь «не» мог вводить запятую.Поэтому приведенный ниже код не удаляет запятые или новые строки.Надеюсь, что это имеет смысл.
public void writeCSV(DataGridView gridIn, string outputFile) {
try {
using (StreamWriter swOut = new StreamWriter(outputFile)) {
//write header rows to csv
for (int i = 0; i < gridIn.Columns.Count; i++) {
swOut.Write(gridIn.Columns[i].HeaderText);
if (i < gridIn.ColumnCount - 1) {
swOut.Write(",");
}
else {
swOut.WriteLine();
}
}
//write DataGridView rows to csv
for (int row = 0; row < gridIn.Rows.Count; row++) {
if (!gridIn.Rows[row].IsNewRow) {
for (int col = 0; col < gridIn.Columns.Count; col++) {
if (dataGridView1.Rows[row].Cells[col].Value != null) {
swOut.Write(dataGridView1.Rows[row].Cells[col].Value.ToString());
}
else {
swOut.Write("");
}
if (col < gridIn.Columns.Count - 1) {
swOut.Write(",");
}
else {
swOut.WriteLine();
}
}
}
}
}
}
catch (Exception e) {
MessageBox.Show("Error: " + e.Message);
}
}