Добавление записей (строка/столбец) в DataGridView; Коллекция уже принадлежит элементу управления DataGridView VB.NET

Я ищу помощь в решении проблемы, которая у меня возникла. У меня есть несколько текстовых файлов в папке. В папке может быть «неограниченное» количество текстовых файлов, хотя обычно от 2 до 150 файлов http://gyazo.com/5f314d1ca374abf9f813914609dd931d (изображения для этого + ниже, не могу вставить из-за отсутствия репутации)

Затем каждый файл содержит «неограниченное» (хотя обычно от 0 до 20 строк) количество данных внутри него. Строка 1 — это «номер теста», а строка 2 — «результат теста», как показано на изображении выше.

В моем представлении сетки данных есть 3 столбца (имя пользователя, номер теста, результат теста) — как показано на изображении выше.

При запуске моего кода ниже; первая запись, добавленная в представление сетки данных, работает отлично, но вторая (или любая запись после первой) возникает ошибка: http://gyazo.com/0d492b97d918853e62c55ee314f3f181 (изображение) или сообщение об ошибке:

«System.InvalidOperationException: коллекция уже принадлежит элементу управления DataGridView. Эта операция больше недействительна. в System.Windows.Forms.DataGridViewCellCollection.Add (DataGridViewCelldataGridViewCell) в SpellingBee.

Эта ошибка возникает на DGVRow.Cells.Add(DGVCell) 'add cell to row

Одна вещь, которую я не хочу делать, — это изменять какие-либо структуры моих текстовых файлов/папок, хотя я знаю, что в настоящее время это неэффективное хранилище.

Как я могу исправить эту ошибку? Я использую VB.net (Visual Studios 2013)

Если вам нужна дополнительная информация, пожалуйста, просто спросите

Большое спасибо.

Imports System.Windows.Forms
Imports System.IO

Public Class TeacherMultiResults

    Dim AmountOfFiles
    Dim LineCount As Integer = 0
    Dim FileName As IO.FileInfo
    Dim DGVRow As New DataGridViewRow
    Dim DGVCell As DataGridViewCell
    Dim Username As String = ""
    Dim TestNumber As Integer = 0
    Dim TestResult As Integer = 0

    Private Sub TeacherMultiResults_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim directory As New IO.DirectoryInfo(LoadForm.CurrentDirectory & "\UserResults\") 'selects directory
        Dim FileNames As IO.FileInfo() = directory.GetFiles()
        Dim Files As IO.FileInfo

        For Each Files In FileNames 'list the names of all files in the specified directory
            Username = Files.ToString
            Username = (Username.Substring(0, Username.Length - 4)) 'removes the .txt from the name

            Try
                LineCount = File.ReadAllLines(LoadForm.CurrentDirectory & "\UserResults\" & Username & ".txt").Length 'amount of lines in file
                If LineCount > 1 Then
                    Dim Information As New System.IO.StreamReader(LoadForm.CurrentDirectory & "\UserResults\" & Username & ".txt") 'opens file
                    LineCount = LineCount / 2 'halfs line count
                    For i = 0 To LineCount - 1
                        TestNumber = Information.ReadLine() 'reads line to variable
                        TestResult = Information.ReadLine() 'reads line to variable
                        i = i + 1 'adds one to i

                        DGVCell = New DataGridViewTextBoxCell 'create a new DGV text box cell
                        DGVCell.Value = Username 'add value to DGV text box cell
                        DGVRow.Cells.Add(DGVCell) 'add cell to row

                        DGVCell = New DataGridViewTextBoxCell 'create a new DGV text box cell
                        DGVCell.Value = TestNumber 'add value to DGV text box cell
                        DGVRow.Cells.Add(DGVCell) 'add cell to row

                        DGVCell = New DataGridViewTextBoxCell 'create a new DGV text box cell
                        DGVCell.Value = TestResult 'add value to DGV text box cell
                        DGVRow.Cells.Add(DGVCell) 'add cell to row

                        DGV_MultiResults.Rows.Add(DGVRow) 'add row to DGV

                    Next
                    Information.Close() 'Close read
                End If

            Catch ex As Exception 'if file won't read
                MsgBox(ex.ToString) 'show error
                Exit Try
            End Try 'end of try

        Next 'end of files

    End Sub

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

Большое спасибо, Тоби.


person TheOvenCook    schedule 03.04.2014    source источник


Ответы (1)


При работе с DataGridView обычно проще просто создать список объектов, а затем привязать его к DGV, используя встроенные функции привязки данных.

Для вашего примера это будет выглядеть так:

' Read the files, build objects as you go and add them to a list
Dim lst = New List(Of TeacherMultiResults)

' Replace this part with your file reading code...
Dim t1 = New TeacherMultiResults With {.Username = "Bob", .TestNumber = 1, .TestResult = 75}
lst.Add(t1)
Dim t2 = New TeacherMultiResults With {.Username = "Rick", .TestNumber = 1, .TestResult = 85}
lst.Add(t2)
Dim t3 = New TeacherMultiResults With {.Username = "Zoe", .TestNumber = 1, .TestResult = 95}
lst.Add(t3)

' Bind the list to the DataGridView
Dim bindList = New BindingList(Of TeacherMultiResults)(lst)
Dim bindSrc = New BindingSource

bindSrc.DataSource = bindList
grid.DataSource = bindSrc

Ваша сетка должна отображать каждый элемент вашего списка.

person Guy Gervais    schedule 03.04.2014
comment
Спасибо за решение. Импорт System.ComponentModel был необходим для работы BindingList. - person TheOvenCook; 06.04.2014
comment
хотя этот метод не работает. Я сделал новый вопрос, поскольку на этот был дан ответ, хотя и не правильно. См. link< /а> - person TheOvenCook; 06.04.2014