我的代码将datagrid保存到csv。何时
TypeError: __init__() missing 1 required positional argument: 'x'
错误消息如下: System.Windows.Forms.DataGridViewCell.Value.get返回null。
然后,我添加大写字母以检查单元格是否为空并将这些单元格替换为“ Null”。
value = dr.Cells[i].Value.ToString();
但是错误消息仍然存在。
以下是我的代码:
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");
}
}
}
答案 0 :(得分:0)
当前代码似乎可以正常工作……如果DataGridView.AllowUserToAddRows
是false
!默认值为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);
}
}