Shaheer Rizwan Ответов: 2

Datagridview записывает заголовки с каждой выбранной строкой в файл .csv


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

Вы можете увидеть ошибку, которую он создает в CSV-файле здесь Изображение ошибки - DGV[^].

Как я могу сделать это так, чтобы он вообще не писал заголовки и полностью пропускал их?
Спасибо!

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

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 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
    'ROLE: Given ({filePath}, True)- Doesn't overwrite file, adds selected row to file under all other values.
    Dim tw As System.IO.TextWriter = New System.IO.StreamWriter("E:\SAT\Work.io\Work.io\bin\Debug\Session.csv", True)
    tw.Write(StrExport)
    tw.Close()
    'Delete Row from dataGVGeneral once saved to Session.csv
    deleteRow()
End Sub

2 Ответов

Рейтинг:
1

OriginalGriff

Да, потому что это то, что вы говорите ему делать!
Вы создаете свои заголовки в верхней части метода и добавляете все данные в файл в конце.
Если вы посмотрите на документацию (Конструктор StreamWriter (System.IO) | Microsoft Docs[^]) тогда вы увидите, что этот код:

Dim tw As System.IO.TextWriter = New System.IO.StreamWriter("E:\SAT\Work.io\Work.io\bin\Debug\Session.csv", True)
В частности, открывает поток файлов для добавления данных, поэтому исходные данные не перезаписываются.
Если это не то, что вы хотите сделать, тогда измените True К False сначала нужно выбросить существующее содержимое файла или изменить код в начале метода, чтобы определить, нужно ли добавлять заголовки. Это может быть так же просто, как "существует ли файл?", или вам, возможно, придется быть умнее и проверить содержимое файла, чтобы увидеть, есть ли строка заголовка (или вообще какие-либо данные).

Сколько раз я должен повторять тебе, чтобы ты перестал гадать и начал думать? :смеяться:


Shaheer Rizwan

Я пытался изменить его на False, когда я изменил его на false, каждый раз, когда я добавлял новую выбранную строку в файл, он полностью переписывал файл, и исходных строк, которые я выбрал, там не было бы. Поэтому я установил его в true, что не перезаписывает файл, но теперь он также записывает заголовки.

Garth J Lancaster

Я думаю, что вам нужно тщательно проверить ответ OriginalGriff - особенно "это может быть так же просто, как "существует ли файл?", или вам, возможно, придется быть умнее и проверить содержимое файла, чтобы увидеть, есть ли строка заголовка (или вообще какие-либо данные)." - теперь вы настраиваете true на false и обратно - так что очевидно, что само по себе это не сработает - следовательно, почему я написал бы временный файл и объединил его - таким образом, дополнительные строки заголовка могли бы быть удалены, если бы вы не реализовали более разумную логику, как предлагалось

OriginalGriff

- перестань гадать и начинай думать."

Звук еще не знакомы? :смеяться:

Shaheer Rizwan

да, я пытаюсь уже целую вечность. Я думал, что мне помогут, пока я борюсь.

OriginalGriff

Вы боретесь, потому что вы гадаете, а не думаете.

Совершенно очевидно, что если вы пишете заголовки в файл несколько раз, вы получите "несколько заголовков", и единственный способ предотвратить это-это ... напишите их один раз. Если вы думаете о том, что вы делаете и что вы пытаетесь сделать, это очевидно в любом случае. Если бы вы записали цифры на листе бумаги, вы бы не добавляли заголовки, если бы лист не был пустым, не так ли? Так почему бы не подумать об этом и не распространить эту логику на ваше приложение?

Я не пытаюсь быть противным здесь - но если вы не начнете думать о том, что вы делаете, вы действительно не продвинетесь далеко самостоятельно - как вы видели за последнюю неделю или около того!

Гадание не работает: ни в программном обеспечении, ни в реальном мире. Мышление и обучение делают это!

Shaheer Rizwan

Ну, я все исправил! Спасибо, приятель. Но теперь, когда я выбираю несколько строк, он записывает обе строки в одну строку. Пожалуйста, не проветривайте его, просто предложите, что я могу здесь сделать. И я знаю, что ты не пытаешься быть противным, я просто очень напряжен, потому что этот проект должен быть в пятницу, и я жонглировал другими предметами, и да, это просто стресс

OriginalGriff

И если вы посмотрите на свой код, разве не очевидно, почему?
Подсказка: где вы добавляете данные ячейки и где вы добавляете новую строку?

Richard MacCutchan

Это было бы менее напряженно, если бы вы приняли совет, который вам дали. Смотрите мое решение ниже.

Рейтинг:
1

Richard MacCutchan

Я объяснил, что вам нужно сделать (более одного раза), и предложил несколько примеров кода, чтобы сделать это правильно. Но вы продолжаете игнорировать его и повторяете тот же самый вопрос. Если вы не начнете следовать советам, которые вам дали, вы просто потеряете свое время, не говоря уже о том, что все здесь.


Shaheer Rizwan

да, это был код, который вы написали. ИДК почему-то все испортил, я попробовал немного доработать, и это наконец сработало