изменить угловой случай, отметьте ноль в c # - PullRequest
0 голосов
/ 28 ноября 2018

Мой код сохранить сетку данных в CSV.когда процесс к

value = dr.Cells[i].Value.ToString();

Сообщение об ошибке следующее: System.Windows.Forms.DataGridViewCell.Value.get возвращает ноль.

Затем я добавляю регистр угловчтобы проверить, что ячейка пуста, и заменить эти ячейки на «Пусто».

foreach (DataGridViewRow rw in this.dataGridView1.Rows)
                {
                    for (int i = 0; i < rw.Cells.Count; i++)
                    {
                        if (rw.Cells[i].Value == System.DBNull.Value)
                        {
                            swOut.Write("Null");
                        }
                    }
                }

Но сообщение об ошибке все еще там.

Вот мой код:

 public void writeCSV(DataGridView gridIn, string outputFile)
        {
            //test to see if the DataGridView has any rows
            if (gridIn.RowCount > 0)
            {
                string value = "";
                DataGridViewRow dr = new DataGridViewRow();
                 StreamWriter swOut = new StreamWriter(outputFile);

                foreach (DataGridViewRow rw in this.dataGridView1.Rows)
                {
                    for (int i = 0; i < rw.Cells.Count; i++)
                    {
                        if (rw.Cells[i].Value == System.DBNull.Value)
                        {
                            swOut.Write("Null");
                        }
                    }
                }

                //write header rows to csv
                for (int i = 0; i <= gridIn.Columns.Count - 1; i++)

                {

                    if (i > 0)
                    {
                        swOut.Write(",");
                    }
                    swOut.Write(gridIn.Columns[i].HeaderText);
                }

                swOut.WriteLine();

                //write DataGridView rows to csv
                for (int j = 0; j <= gridIn.Rows.Count - 1; j++)

                {

                    if (j > 0)
                    {
                        swOut.WriteLine();
                    }

                    dr = gridIn.Rows[j];

                    for (int i = 0; i <= gridIn.Columns.Count - 1; i++)

                    {

                        if (i > 0)
                        {
                            swOut.Write(",");
                        }

                        value = dr.Cells[i].Value.ToString();
                        //replace comma's with spaces
                        value = value.Replace(',', ' ');
                        //replace embedded newlines with spaces
                        value = value.Replace(Environment.NewLine, " ");

                        swOut.Write(value);
                    }
                }
                swOut.Close();
            }
        }

1 Ответ

0 голосов
/ 29 ноября 2018

Текущий код работает ... ЕСЛИ 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);
   }
 }
...