Kamil Batelt Ответов: 1

Сохраните выбранную строку в текстовый файл и загрузите


Привет!

Так что ... пожалуйста, помогите :D Я пытаюсь уже два дня, но безрезультатно.
У меня есть DataGridView с ComboBox в качестве первого столбца. Это выглядит примерно так:

Статус | имя | номер | etc..
(комбинированный список) Джон 000000
(комбинированный список) Билли 111111
и т.д..

Значения загружаются кнопкой из текстового файла, с "," за каждым значением, как в файле .csv. Значения combobox-нет контакта, занято. Я установил режим выбора DataGridView в row. Таким образом, мне не нужно выбирать каждую ячейку, мне просто нужна вся строка. Теперь я пытаюсь сделать так, чтобы после клика на for e.g.John вся строка сохранялась в текстовый файл - он должен выглядеть так:
2,Джон,000000,...,...,...

Далее, после нажатия на Билли, текстовый файл выглядит так:
2,Джон,000000,...,...,...
1,Билли,111111,...,...

Где значение 1 - "Нет контакта", а 2 - "занято".
Затем я хочу сделать кнопку загрузки для чтения значений из текстового файла, который я сохранил, и поместить это в DataGridView. e.g:
Текстовый файл:
2,Джон,000000,...,...,...
1,Билли,111111,...,...

Нажмите кнопку Загрузить: DataGridView
2,Джон,000000,...,...,... > занят,Джон,000000,...,...
1,Билли,111111,...,... > Нет контакта,Билли,111111,...,...

Это то, что у меня уже есть:
Public Class Start
    Dim dataTable As New DataTable
    Dim cmenu As New DataGridViewComboBoxColumn()

    Private Sub IconButton2_Click(sender As Object, e As EventArgs) Handles IconButton2.Click
        Dim thereader As New IO.StreamReader("HEHE\Desktop\data\data.txt", System.Text.Encoding.Default)
        Dim sline As String = ""
        Do
            sline = thereader.ReadLine
            If sline Is Nothing Then Exit Do
            Dim thecolumns() As String = sline.Split(",")
            Dim newrow As DataRow = dataTable.NewRow
            newrow("Name") = thecolumns(0)
            newrow("LastName") = thecolumns(1)
            newrow("Number") = thecolumns(2)
            newrow("Address") = thecolumns(3)
            newrow("Age") = thecolumns(4)
            newrow("E-mail") = thecolumns(5)
            dataTable.Rows.Add(newrow)
        Loop
        thereader.Close()
        clients.DataSource = dataTable
        clients.Columns(3).CellTemplate.Style.ForeColor = RGBColors.color7
        clients.Columns(3).CellTemplate.Style.Font = New Font(clients.DefaultCellStyle.Font, FontStyle.Bold)
        clients.Columns("Address").Width = 200
        clients.Columns("E-mail").Width = 200
        clients.Columns("Age").Width = 70
        clients.Columns("Name").ReadOnly = True
        clients.Columns("LastName").ReadOnly = True
        clients.Columns("Number").ReadOnly = True
        clients.Columns("Address").ReadOnly = True
        clients.Columns("Age").ReadOnly = True
        clients.Columns("E-mail").ReadOnly = True
        Me.Text = dataTable.Rows.Count & "rows"
        IconButton2.Enabled = False
    End Sub

    Private Sub Start_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        With dataTable
            .Columns.Add("Name", System.Type.GetType("System.String"))
            .Columns.Add("LastName", System.Type.GetType("System.String"))
            .Columns.Add("Number", System.Type.GetType("System.Decimal"))
            .Columns.Add("Address", System.Type.GetType("System.String"))
            .Columns.Add("Age", System.Type.GetType("System.Decimal"))
            .Columns.Add("E-mail", System.Type.GetType("System.String"))
        End With

        clients.BackgroundColor = RGBColors.color4
        clients.Columns.Add(cmenu)
        cmenu.HeaderText = "Status"
        cmenu.Name = "cmb"
        cmenu.MaxDropDownItems = 4
        cmenu.Items.Add("Brak kontaktu")
        cmenu.Items.Add("Oddzwonienie")
        cmenu.ReadOnly = False
    End Sub

End Class


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

Dim swWriter As New IO.StreamWriter("HEHE\Desktop\data\data.txt")
Dim LineToWrite As String = String.Empty

Try
    For _Row As Integer = 0 To clients.Rows.Count - 1
        LineToWrite = String.Empty
        For _Column As Integer = 0 To clients.Columns.Count - 1
            LineToWrite &= "," & clients.Rows(_Row).Cells(_Column).Value.ToString
        Next
        LineToWrite = LineToWrite.Remove(0, 1)
        swWriter.WriteLine(LineToWrite)
    Next
    swWriter.Flush()
    swWriter.Close()
    MessageBox.Show("Data Saved Successfully")
Catch ex As Exception

1 Ответов

Рейтинг:
1

OriginalGriff

Вы можете сделать это самостоятельно - и это может быть сложно, потому что ничто не мешает вашим пользователям вводить строки с запятыми, поэтому вам нужно обработать входные данные, чтобы убедиться, что вы "избегаете" запятых или строк с двойными кавычками, - или вы можете использовать пакет, чтобы помочь вам.

Для CSV-данных попробуйте сделать следующее: Быстрый читатель CSV[^] или CsvHelper[^- Я только что начал со второго, и он выглядит довольно хорошо.
Любой из них сделает всю "тяжелую работу" за вас.

Кроме того, если вы не фиксированы на использовании формата CSV, который вы показываете, XML и JSON являются гораздо лучшими решениями и изначально поддерживаются .NET (но Newtonsoft.JSON намного лучше!)