Добавление записей (Row/ Column) в DataGridView; Коллекция уже принадлежит элементу управления DataGridView VB.NET
Я ищу некоторую помощь по проблеме, которая у меня возникла. У меня есть несколько текстовых файлов в папке. В папке может быть "неограниченное" количество текстовых файлов, хотя обычно это 2-150 файлов http://gyazo.com/5f314d1ca374abf9f813914609dd931d (изображения для этого + ниже не могут быть вставлены из-за отсутствия репутации)
Каждый файл тогда содержит "неограниченный" (хотя обычно 0-20 строк) объем данных внутри него. Строка 1 - это "номер теста", а строка 2 - "результат теста", как показано на рисунке выше.
My Data Grid View имеет 3 столбца (имя пользователя, номер теста, результат теста) - как показано на рисунке выше
При запуске моего кода ниже; Первая запись, добавляемая в представление таблицы данных, работает отлично, но во второй (или любой записи после первой) возникает ошибка: http://gyazo.com/0d492b97d918853e62c55ee314f3f181 (изображение) или сообщение об ошибке:
"System.InvalidOperationException: Collection уже принадлежит к элементу управления DataGridView. Эта операция больше не действительна. В System.Windows.Forms.DataGridViewCellCollection.Add(DataGridViewCelldataGridViewCell) в SpellingBee.TeacherMultiResults.TeacherMultiResults_Logs Event ()
Эта ошибка возникает на 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
Я надеюсь, что кто-то может помочь мне с этой проблемой, я понимаю, что это довольно просто исправить, скорее всего, хотя я не могу найти решение этой ошибки!
Большое спасибо, Тоби.
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
Ваша сетка должна отображать каждый элемент вашего списка.