编辑角大小写,在c#中检查null



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

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

错误消息如下:System.Windows.Forms.DataGridViewCell.Value.get返回null

然后,我添加角大小写来检查单元格是否为null,并用"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();
}
}

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

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

当它到达"新"行时。"新"行中的单元格是null,而不是DBNull.如果您想允许用户添加行(我认为是这样,因为代码去掉了逗号和新行(,那么代码需要检查此"新"行将在导出网格时忽略它。

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

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

相关内容

  • 没有找到相关文章