【问题标题】:Importing CSV to DataGridView Error With CheckBox Column使用 CheckBox 列将 CSV 导入 DataGridView 错误
【发布时间】:2021-08-30 06:17:55
【问题描述】:

我有一个 DataGridView,我将值保存到 CSV 文件中。该代码在 CSV 中创建一个空值,其中 DataGridView 中有一个空单元格。我遇到的问题是 DataGridView 中的第 10 列。这是一个复选框列。此列的值为“Nothing”,除非它已被选中或未选中,在这种情况下该值变为 0 或 1(False 或 True)。

当我将 CSV 加载回 DataGridView 时,如果 CheckBox 列有空值,我会收到错误消息。从 CSV 导入时,DataGridView 不接受此列的“Nothing”值。

有没有办法将第 10 列的值仅导出为 0 或 1?

希望有人能帮我解决这个问题。 提前致谢。

这是我用来将 DataGridView 保存到 CSV 文件的代码。

        Dim rows = From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)()
                   Where Not row.IsNewRow
                   Select Array.ConvertAll(row.Cells.Cast(Of DataGridViewCell).ToArray, Function(c) If(c.Value IsNot Nothing, c.Value.ToString, ""))
        Using sw As New IO.StreamWriter(Path)
            For Each r In rows
                sw.WriteLine(String.Join(",", r))
            Next
        End Using

这是我用来将 CSV 加载回 DataGridView 的代码。

        Try
            Dim streamReader As IO.StreamReader = New IO.StreamReader(FullPath)
            'Read CSV file content 
            While streamReader.Peek() <> -1
                rowvalue = streamReader.ReadLine()
                cellvalue = rowvalue.Split(","c)
                    DataGridView1.Rows.Add(cellvalue)
            End While
            streamReader.Close()
        Catch ex As Exception
            MsgBox("File not found")
        End Try

【问题讨论】:

  • 你真正想做什么?是否希望网格仅包含 TrueFalse?您是否希望网格包含Nothing 但将其导出为False?您是否希望文件包含空值但将它们导入为False?您是否希望文件包含空值并将它们导入为Nothing?所有这些都减少了可能性。
  • 我建议具体问题是您将该数据导入为空的Strings,而不是Nothing。您需要确定您实际上要解决的问题。您是要正确导入已有的数据还是要导入不同的数据?
  • 我刚刚测试过,我可以确认将Nothing 导入复选框列效果很好,但导入一个空的String 则不行。这正是您应该期望的,因为该列首先包含Nothing,但是在期望TrueFalse 的列中的任何类型的String 根本没有意义。
  • 感谢您的及时回复@jmcilhinney。我将复选框列的基础值设置为 0 和 1。理想情况下,复选框列不会有任何“无”值,只有 0 或 1,所以当我导出到 CSV 并重新导入它时,不应该有有什么问题。

标签: vb.net csv datagridview export-to-csv


【解决方案1】:

如果您不希望该列中有任何空值,则不允许任何空值。最简单的选项是在添加行时将该列中单元格的Value 设置为False(如果尚未设置为其他值):

Private Sub DataGridView1_RowsAdded(sender As Object, e As DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
    Dim cell = DataGridView1.Rows(e.RowIndex).Cells(checkBoxColumnIndex)
    Dim value = cell.Value

    If value Is Nothing Then
        cell.Value = False
    End If
End Sub

这样,False 实际上成为该列的默认值。您现有的所有导出和导入代码都可以正常工作。

【讨论】:

    【解决方案2】:

    如果我很理解你需要这样的东西。这是您的代码,其中包含一些更改,可帮助您了解如何实现目标。 显然还有其他方法,其中之一是: (请注意,它没有经过测试,它只是说明性的,你必须工作/测试它)

        Dim indexOfCheckBoxColumn As Integer = 10
        Dim getValues As Func(Of DataGridViewCell, String) = Function(c As DataGridViewCell)
                                                                 If c.ColumnIndex = indexOfCheckBoxColumn Then
                                                                     If c.Value Is Nothing Then Return "0"
                                                                     Return CStr(IIf(Convert.ToBoolean(DirectCast(c, DataGridViewCheckBoxCell).Value) = True, "1", "0"))
                                                                 Else
    
                                                                     If c.Value IsNot Nothing Then Return c.Value.ToString
                                                                 End If
                                                                 Return ""
                                                             End Function
    
    
        Dim rows = From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)()
                   Where Not row.IsNewRow
                   Select Array.ConvertAll(row.Cells.Cast(Of DataGridViewCell).ToArray, Function(cell) getValues(cell))
    
    
        Using sw As New IO.StreamWriter(Path)
            For Each r In rows
                sw.WriteLine(String.Join(",", r))
            Next
        End Using
    

    【讨论】:

      猜你喜欢
      • 2020-12-20
      • 2016-06-07
      • 2016-08-03
      • 2014-02-18
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2013-09-15
      相关资源
      最近更新 更多