【问题标题】:VB2010 read a csv in datagrid, update in grid and save to same csvVB2010在datagrid中读取一个csv,在grid中更新并保存到同一个csv
【发布时间】:2014-10-02 12:49:56
【问题描述】:

在 VB2010 中创建了一个程序,用于在 datagridviewer 中读取 csv 文件,更新网格中的单元格并保存到相同的 csvfile 中

在 datagridviewer 中打开 csvfile 可以正常工作, 在 datagridviewer 中更新也可以正常工作

但是当我将数据网格保存到同名的 csv 文件时,我收到一条错误消息“该进程无法访问该文件,因为它被其他进程使用”。

但是如果我将它保存到其他文件名就可以了。 然后我尝试将具有新文件名的新文件复制回原始文件名。 我仍然收到相同的错误消息,因为该文件仍在使用中,所以我无法复制。

现在有没有人可以解决这个问题。

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim fName As String = ""
        OpenFileDialog1.InitialDirectory = "H:\Data\2014\Software\VB2010\"
        OpenFileDialog1.Filter = "CSV files (*.csv)|*.CSV"
        OpenFileDialog1.FilterIndex = 2
        OpenFileDialog1.RestoreDirectory = True

        If (OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then
            fName = OpenFileDialog1.FileName
        End If

        Me.TextBox1.Text = fName

        Dim TextLine As String = ""
        Dim SplitLine() As String
        DataGridView1.ColumnCount = 5
        DataGridView1.Columns(0).Name = "Name"
        DataGridView1.Columns(1).Name = "Gender"
        DataGridView1.Columns(2).Name = "Age"
        DataGridView1.Columns(3).Name = "Ranking"
        DataGridView1.Columns(4).Name = "Date"

        If System.IO.File.Exists(fName) = True Then
            Dim objReader As New System.IO.StreamReader(fName)
            Do While objReader.Peek() <> -1
                TextLine = objReader.ReadLine()
                SplitLine = Split(TextLine, ",")
                Me.DataGridView1.Rows.Add(SplitLine)
            Loop
        Else
            MsgBox("File Does Not Exist")
        End If

    End Sub


    Private Sub SaveGridDataInFile(ByRef fName As String)
        'method called by button2
        Dim I As Integer = 0
        Dim j As Integer = 0
        Dim cellvalue$
        Dim rowLine As String = ""

        Try
            Dim objWriter As New System.IO.StreamWriter(fName, True)
            For j = 0 To (DataGridView1.Rows.Count - 2)
                For I = 0 To (DataGridView1.Columns.Count - 1)
                    If Not TypeOf DataGridView1.CurrentRow.Cells.Item(I).Value Is DBNull Then
                        cellvalue = DataGridView1.Item(I, j).Value
                    Else
                        cellvalue = ""
                    End If
                    rowLine = rowLine + cellvalue + ","
                Next
                objWriter.WriteLine(rowLine)
                rowLine = ""
            Next
            objWriter.Close()
            objWriter = Nothing
            MsgBox("Text written to file")
        Catch e As Exception
            MessageBox.Show("Error occured while writing to the file." + e.ToString())
        Finally
            FileClose(1)
        End Try
        Call copy_file()
    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
          
                'çall method SaveGridDataInFile
                SaveGridDataInFile(Me.TextBox1.Text)
                '  FileCopy("H:\Data\2014\Software\VB2010\datagr_ex2.csv", "H:\Data\2014\Software\VB2010\datagr_ex.csv")
    End Sub
Sub copy_file()
        Dim FileToDelete As String

        FileToDelete = "H:\Data\2014\Software\VB2010\datagr_ex.csv"

        If System.IO.File.Exists(FileToDelete) = True Then

            System.IO.File.Delete(FileToDelete)
            MsgBox("File Deleted")

        End If

        FileCopy("H:\Data\2014\Software\VB2010\datagr_ex2.csv", "H:\Data\2014\Software\VB2010\datagr_ex.csv")
    End Sub

【问题讨论】:

  • 菲利普谢谢。此解决方案效果很好
  • 没问题,请将问题标记为已回答,谢谢

标签: vb.net csv datagridview


【解决方案1】:

我的猜测是您需要关闭用于加载文件的StreamReader,然后才能重新打开文件以保存它。 StreamReader 类实现了IDisposable,因此您可以使用VB.Net 的Using Statement 在您完成阅读时自动关闭文件,即

    If System.IO.File.Exists(fName) = True Then
        Using objReader As New System.IO.StreamReader(fName)
            Do While objReader.Peek() <> -1
                TextLine = objReader.ReadLine()
                SplitLine = Split(TextLine, ",")
                Me.DataGridView1.Rows.Add(SplitLine)
            Loop
        End Using
    Else
        MsgBox("File Does Not Exist")
    End If

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 2018-08-27
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2022-10-12
    相关资源
    最近更新 更多