Привязка словаря к сетке WinForms (или комбо)? - PullRequest
1 голос
/ 24 августа 2011

У вас есть класс псевдостолов и класс псевдорядов.Строка является несколько общей и не имеет строго типизированных полей.Он соответствует типичному словарному интерфейсу

Dim age As Object = person("Age") 'accessed via default property Item

против

Dim age As Integer = person.Age 'an actual property typed as an Integer

Какой шаблон использовать, чтобы мы могли связать нашу псевдотаблица и ее строки с сеткой или комбинированным полем?

Dim rs As New clsResultSet(tblPeople)
Dim id As Object   = rs(0)("Id")   '913
Dim name As Object = rs(0)("Name") 'Ted
Dim age As Object  = rs(0)("Age")  '43
Dim occupation As Object = rs(0)("Occupation") 'cab driver

grd.DataSource = rs 'In grid I expect to see Name, Age, Occupation columns

cbo.DataSource    = rs
cbo.DisplayMember = "Name" 'could we do this?
cbo.ValueMember   = "Id"   '...and this?

Я прочитал все о IList, IBindingList, BindingSource и т. Д., Попробовал кое-что, и я все еще ломаю голову над тем, как сделать это правильно.В большинстве примеров, которые я нашел, ожидается, что ваши объекты записей будут строго типизированы (например, person.Age, а не person ("Age")).

Вот несколько простых классов, с которых можно начать:

Public Class clsResultSet 'Like a DataTable
    Inherits List(Of clsRecord)

    Private mdicFields As New Dictionary(Of String, Object)

    Public Sub New(vdt As DataTable) 'Loaded from table
        For Each bdc As DataColumn In vdt.Columns
            Me.mdicFields.Add(bdc.ColumnName, bdc)
        Next
        For Each vdr As DataRow In vdt.Rows
            Me.Add(New clsRecord(vdr, Me))
        Next
    End Sub

    Public ReadOnly Property Fields As Dictionary(Of String, Object)
        Get
            Return Me.mdicFields
        End Get
    End Property
End Class

Public Class clsRecord 'Like a DataRow
    Inherits Dictionary(Of String, Object)
    Private mrs As clsResultSet

    Protected Friend Sub New(vdr As DataRow, vrs As clsResultSet)
        Me.mrs = vrs
        For Each bPair As KeyValuePair(Of String, Object) In vrs.Fields
            Me.Add(bPair.Key, vdr(bPair.Key))
        Next
    End Sub
End Class

На этот вопрос, как его спросили, был дан ответ.Я перефразировал его , так как я не дошел до корня своей проблемы.

1 Ответ

0 голосов
/ 25 августа 2011

Насколько я знаю, нет способа напрямую связать объекты словаря. Вот быстрый обходной путь для комбинированного списка с фиксированным источником данных. Создайте новый список с требуемыми свойствами, используя Select и анонимные объекты (работает с Visual Studio 2008 и новее):

Dim rs As New clsResultSet(tblPeople)
cbo.DataSource = rs.Select(Function(x) New With {.Name = x("Name"), .Id = x("Id")}).ToList()
cbo.DisplayMember = "Name"
cbo.ValueMember   = "Id"

Полагаю, вы могли бы использовать аналогичный подход для привязки к DataGridView, но я бы рекомендовал вместо этого использовать строго типизированный класс (класс Person со свойствами Name, Age и т. Д.), Если только он не предназначен для чтения. только DataGridView, который не изменится.

Edit:

Возможно, вас заинтересует раздел «Замечания» в документации DataGridView.DataSource . По сути, источником данных может быть IList, IListSource, IBindingList или IBindingListView. Классы DataTable и DataSet реализуют IListSource, поэтому стоит попробовать реализовать этот интерфейс для вашего собственного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...