【问题标题】:datagrid for vb.net, reading from csvvb.net 的数据网格,从 csv 读取
【发布时间】:2016-02-16 17:28:43
【问题描述】:

我正在做家庭作业,但在尝试研究信息时遇到了绊脚石。我最大的问题是,我可以找到很多关于数据网格或 CSV 文件的信息,但不能同时找到这两者。

我的目标是在我从 CSV 文件(在 buttonclick1 事件上)读取数据网格的第 14 列后,添加并平均该列,然后将该平均值放入标签中。我的第 14 列在字符串中,并且该特定列具有 $#,### 值。

现在,我的 button1 点击事件除了提出一个错误告诉我索引超出范围,它必须是一个非负数并且小于集合的大小之外,什么都不做。

所以,我意识到这对你们中的大多数人来说是一种补救措施,但我完全不知道如何继续。

Public Class frmMain
    Dim rowContents As String
    Dim cellContents(20) As String
    'closes stuff
    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

    Private Sub btnImport_Click(sender As Object, e As EventArgs) Handles btnImport.Click
        DataGridView1.ColumnHeadersVisible = True
        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("F:\1TrevorProjects\MedicalCSV\MedicalProviders.csv")
            MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
            MyReader.SetDelimiters(",")
            Dim currentRow As String()
            While Not MyReader.EndOfData
                Try
                    currentRow = MyReader.ReadFields()
                    DataGridView1.Rows.Add(currentRow)
                    'Dim currentField As String
                    'For Each currentField In currentRow
                    'MsgBox(currentField)
                    'Next
                Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("Line" & ex.Message & "is not valid and will be skipped.")

                End Try
            End While
            MyReader.Close()
        End Using
    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim total As String = 0
        For i As Integer = 0 To DataGridView1.RowCount - 1
            total += DataGridView1.Rows(i).Cells(14).Value
        Next
        TextBox1.Text = total
    End Sub
End Class

【问题讨论】:

  • 问题是 CSV 包含所有字符串数据。我倾向于创建一个带有类型列的 DataTable(即一个数字将存储在 Int32 列中)。向其中添加行,然后将 DataTable 绑定到 DataGridView (==DataGrid ???)。迭代数据表以添加 numbers 很容易。顺便说一句,是有错误还是没有按您的意愿工作?什么问题
  • 哦,对不起,我会更新的。 Button1_Click 什么都不做。我真的只是想找到代码创意来取代那个特定的代码。我已将 CSV 编辑为仅在我希望添加在一起的列中包含数字数据并更改了列标题(如果这就是您所指的?)我可以更多地研究将两者绑定在一起。我没有看过或想过这个想法。谢谢!另外,感谢您修复我的格式!
  • 您是否在设计器中添加了 DGV 列? (它甚至是 DGV 吗?)“休息一下”是什么意思?有错误吗?
  • 我做到了!我有 14 列显示在设计器窗口上,每列都有它们的名称并被冻结(如果重要的话)。呃,是我说程序强迫我打破这个过程。所以是的,一个错误大声笑。我很抱歉在这方面做得不好,而且比其他任何事情都更令人困惑。
  • 刚刚更新,但要完整引用:mscorlib.dll 中出现“system.ArgumentOutOfRangeException”类型的未处理异常——附加信息:索引超出范围。必须为非负数且小于集合的大小

标签: vb.net csv visual-studio-2012 datagrid


【解决方案1】:

两件事:

  • 如果 DGV 将 AllowUsersToAddRows 设为 True,您的行循环将迭代太多行并抛出 NullReferenceException
  • 如果目标列是 #14,则单元格计数从零开始,因此您应该引用 .Cell(13) 的值。

您可以在填充 DGV 时轻松进行计算:

Dim theTotal As Int32
Dim rCount As Int32
...
DataGridView1.Rows.Add(currentRow)
theTotal += Convert.ToInt32(currentRow(13))
rCount += 1

那么当循环结束时:

Dim theAvg = (theTotal / rCount )

如果数据在 CSV 中作为格式化货币(“$123,45”),请改用:

theTotal += Decimal.Parse(currentRow(13), NumberStyles.Currency)

通常在真正的应用程序中,您必须对数据执行一些操作,例如导入数据库、添加列、删除列等。在这种情况下,我会避免直接填充 DGV 并使用DataTable。特别是,如果代码必须在循环中从字符串中解析出格式化的货币。

不过,这似乎有点矫枉过正。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多