Запись нескольких выбранных строк DataGridView в CSV - PullRequest
1 голос
/ 04 августа 2020

Приведенный ниже код успешно позволяет мне записать выбранную строку в файл .csv.

У меня возникают проблемы, когда, когда я выбираю несколько строк и пытаюсь записать их в файл, он помещает все строки в одной строке файла .csv.

Как я могу изменить приведенный ниже код, чтобы он позволял выбирать несколько строк и записывал каждую строку в новую строку файла. csv файл?

Dim StrExport As String = ""
For Each C As DataGridViewColumn In dataGVGeneral.Columns
    StrExport &= "" & C.HeaderText & ","
Next
StrExport = StrExport.Substring(0, StrExport.Length - 1)
StrExport &= Environment.NewLine
'Only the row which is selected will be written
For Each R As DataGridViewRow In dataGVGeneral.Rows
    If R.Selected = True Then
        For Each C As DataGridViewCell In R.Cells
            If Not C.Value Is Nothing Then
                StrExport &= "" & C.Value.ToString & ","
            Else
                StrExport &= "" & "" & ","
            End If
        Next
    Else
        StrExport = StrExport.Substring(0, StrExport.Length - 1)
        StrExport &= Environment.NewLine
    End If
Next
Dim tw As System.IO.TextWriter = New System.IO.StreamWriter("E:\SAT\Work.io\Work.io\bin\Debug\Session.csv", False)
tw.Write(StrExport)
tw.Close()

1 Ответ

0 голосов
/ 04 августа 2020

В строке StrExport = StrExport.Substring(0, StrExport.Length - 1), я думаю, вы хотели использовать &= вместо =.

Однако вы должны использовать StringBuilder для создания строки, потому что он более эффективен при объединении более десяти частей строки вместе.

Чтобы объединить строки вместе с запятой / чем-либо еще между, String.Join полезно, потому что у вас нет беспокоиться о последней запятой.

И, наконец, немного LINQ вы можете сделать код немного короче, но при этом довольно легко понять:

Private Sub bnSaveSelected_Click(sender As Object, e As EventArgs) Handles bnSaveSelected.Click
    Dim sb As New Text.StringBuilder()
    sb.AppendLine(String.Join(",", dataGVGeneral.Columns.Cast(Of DataGridViewColumn).Select(Function(c) c.HeaderText)))

    For Each dr As DataGridViewRow In dataGVGeneral.Rows
        If dr.Selected Then
            sb.AppendLine(String.Join(",", dr.Cells.Cast(Of DataGridViewCell).Select(Function(c) c.Value.ToString())))
        End If
    Next

    IO.File.WriteAllText("C:\temp\SampleCsv.csv", sb.ToString())

End Sub
...