Shaheer Rizwan Ответов: 2

Проблема при записи нескольких выбранных строк datagridview в CSV


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

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

Что я уже пробовал:

Private Sub btnToSession_Click(sender As Object, e As EventArgs) Handles btnToSession.Click
    'PURPOSE: Write only selected DataGridView row to Session.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 writen
    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
    'ROLE: Given ({filePath}, False)- allows for the file to be completely overwritten with new data.
    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()
End Sub

2 Ответов

Рейтинг:
5

Richard MacCutchan

Сколько еще раз мы должны тебе это объяснять? Вы должны только написать текст внутри if блок, который проверяет выбранную строку. Вы, кажется, создаете гораздо более сложное решение, чем это необходимо. Смотрите мое предложение в разделе комментариев по адресу Только запись выбранных строк datagridview в csv.[^].

Это все что тебе нужно:

' open the writer file first
Dim tw As System.IO.TextWriter = New System.IO.StreamWriter("E:\SAT\Work.io\Work.io\bin\Debug\Session.csv", False)
    ' write the column headings if required
    For Each C As DataGridViewColumn In dataGVGeneral.Columns
        tw.Write(C.Value.ToString & ",")
    Next
    ' add a newline after the column headings
    tw.Write(Environment.NewLine)
    'Only the row which is selected will be writen
    For Each R As DataGridViewRow In dataGVGeneral.Rows
        If R.Selected = True Then
        ' if the row is selected then write all the colmns, including the emty ones
            For Each C As DataGridViewCell In R.Cells
                tw.Write(C.Value.ToString & ",")
            Next
            ' a newline cahracter at the end of the line
            tw.Write(Environment.NewLine)
        End If
    Next
    ' close the file
    tw.Close()


Рейтинг:
15

OriginalGriff

Посмотри на свой код.
Как вы думаете, что это делает?

Else
    StrExport = StrExport.Substring(0, StrExport.Length - 1)
    StrExport &= Environment.NewLine
End If

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

И тридцать секунд с отладчиком показали бы вам это!

Как я уже говорил: перестаньте гадать, начните думать. Это действительно работает легче и быстрее в долгосрочной перспективе.

И не объединяйте строки таким образом: строки неизменяемы, поэтому каждая операция "&" создает новую, большую строку. Если вы хотите построить большую строку, используйте StringBuilder - это намного эффективнее!


Shaheer Rizwan

Да, понял, спасибо, приятель.

Shaheer Rizwan

Но знаете ли вы, как я это исправляю (я много чего перепробовал)?
Скажем, я выбираю 10-ю строку и записываю ее в файл, она записывается в 10-ю строку, несмотря ни на что другое в файле, как я могу получить ее так, чтобы она записывалась в следующую доступную строку, кроме того, какой номер строки она имеет в DataGridView