【问题标题】:edit corner case, check null in c#编辑极端情况,在 c# 中检查 null
【发布时间】:2018-11-28 01:26:55
【问题描述】:

我的代码是将数据网格保存到 csv。当处理到

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

错误信息如下:System.Windows.Forms.DataGridViewCell.Value.get return null。

然后,我添加极端情况以检查单元格是否为空,并将这些单元格替换为“空”。

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();
            }
        }

【问题讨论】:

  • 试试:if (rw.Cells[i].Value == null)

标签: c# csv datagridview datagrid null


【解决方案1】:

当前代码似乎可以工作……如果DataGridView.AllowUserToAddRowsfalse!默认值为true。如果网格允许用户添加行,代码会在该行崩溃……

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

当它到达“新”行时。 “新”行中的单元格是 null 而不是 DBNull. 如果您想允许用户添加行(我假设是这种情况,因为代码正在去除逗号和新行),那么代码将需要检查这个“新”行并在导出网格时忽略它。

话虽如此,我相信你让这种方式变得比它必须的更复杂。目标是将DataGridView 中的单元格导出到逗号分隔文件 (CSV)。这可以用更少的代码来完成,并且仍然避免单元格中可怕的空值。

从 CSV 文件的角度来看,如果一个单元格为“null”,则意味着我们要向 CSV 文件输出一个“空”字符串。这将维护列模式。因此,只需要通过网格单元进行简单的双循环即可。在遍历单元格并将值写入文件时,在我们尝试抓取单元格value.ToString() 之前需要进行简单的检查。如果value 为空,代码将崩溃,因为null 没有ToString() 方法。因此,如果value“是”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);
   }
 }

【讨论】:

  • 感谢您清晰的解释和编辑的代码。他们完美地解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多