2014-11-25 2 views
0

Я хочу связать список объектов с DataGridView в VB.Привязать список объектов к datagridview в VB

Сначала он работал с использованием datagrid.Rows.Add (...) для каждого результата, но это блокирует программу. Я прочитал, что это можно решить, связав список объектов с DataGridView с .DataSource. Но это не работает, мой datagridview остается пустым ...

Что не так? Это что-то в GUI-коде (см. Ниже)?

Это где логика происходит:

Public queryList As New List(Of _study) 

... 

If _objResponse.Status = CurrentStatus.Pending Then 
     Dim _newStudy As New _study 

     ' Parse one study from the response (_objResponse.Dataset.[Get](Of String)(DicomTag.StudyDate)) 
     _newStudy._studyID = _objResponse.Dataset.[Get](Of String)(DicomTag.StudyInstanceUID) 
     _newStudy._name = _objResponse.Dataset.[Get](Of String)(DicomTag.AccessionNumber) 

     ' Save study info for later use 
     queryList.Add(_newStudy)    

ElseIf _objResponse.Status = DicomStatus.Success 
     dgvResults.DataSource = queryList 
     ... 
Else 
     MsgBox("Failed") 
End If 

Вот класс _newStudy:

Public Class _study 

    Private _studyID As String 
    Private _name As String 

    Public Property _studyID() As String 
    Get 
     Return _studyID 
     End Get 
     Set(ByVal value As String) 
     _studyID = value 
     End Set 
    End Property 

    Public Property _name() As String 
    Get 
     Return _name 
    End Get 
    Set(ByVal value As String) 
     _name = value 
    End Set 
    End Property 
End Class 

А вот код DataGridView() GUI:

Private colName As System.Windows.Forms.DataGridViewTextBoxColumn 
Private colID As System.Windows.Forms.DataGridViewTextBoxColumn 
Private dgvResults As System.Windows.Forms.DataGridView 

... 

Me.dgvResults = New System.Windows.Forms.DataGridView() 
Me.colID = New System.Windows.Forms.DataGridViewTextBoxColumn() 
Me.colName = New System.Windows.Forms.DataGridViewTextBoxColumn() 

Me.dgvResults.AllowUserToAddRows = false 
Me.dgvResults.AllowUserToDeleteRows = false 
Me.dgvResults.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill 
Me.dgvResults.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize 
Me.dgvResults.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.colID, Me.colName}) 
Me.dgvResults.Location = New System.Drawing.Point(6, 19) 
Me.dgvResults.Name = "dgvResults" 
Me.dgvResults.ReadOnly = true 
Me.dgvResults.Size = New System.Drawing.Size(540, 206) 
Me.dgvResults.TabIndex = 2 

'colID 
Me.colID.HeaderText = "Study ID" 
Me.colID.DataPropertyName = "_studyID" 
Me.colID.Name = "colID" 
Me.colID.ReadOnly = true 

'colPatientName 
Me.colName.HeaderText = "Name" 
Me.colName.DataPropertyName = "_name" 
Me.colName.Name = "_name" 
Me.colName.ReadOnly = true 

... 

CType(Me.dgvResults,System.ComponentModel.ISupportInitialize).EndInit 

I подумайте, что DataPropertyName верна, чтобы получить связь между объектами и datagrid, правильно ...?

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

+0

Это не ясно из вашего кода * когда * управления DataGridView имеет свой DataSource набор. Это происходит постоянно? Только когда вы получите статус «Успех»? Только покажите нам реальный код, кстати, ваш класс _study не компилируется, и вам следует избегать подчёркивать публичные свойства и имена. Вы добавляете столбец Me.colPatientID дважды в сетку в дизайнере? – LarsTech

ответ

1

Объект List не передает информацию о том, что список был обновлен или изменен.

Чтобы сделать это, попробуйте использовать BindingList из пространства имен System.ComponentModel:

Public queryList As New BindingList(Of _study) 
+0

Хороший звонок, но по-прежнему нет данных на сетке – francisMi

+0

@francisMi Смотрите мои комментарии к вашему сообщению. Приведенный код не делает его очень ясным, если все правильно установлено или нет. Я бы подумал, что вы установили DataSource в сетку ранее в этом процессе. – LarsTech

Смежные вопросы