VB.NET с использованием LINQ для транспонирования ObservableCollection - PullRequest
1 голос
/ 11 августа 2010

У меня есть собственный класс элементов (в основном два строковых значения со связанными свойствами), как показано ниже:

Public Class itmDataDetails
    Private _strDataName As String
    Private _strDataValue As String

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

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

    Public Sub New(Optional ByVal strDataNameIn As String = "", Optional ByVal strDataValueIn As String = "")
        strDataName = strDataNameIn
        strDataValue = strDataValueIn
    End Sub

и класс-оболочка ObservableCollection вокруг этого.Я хотел бы переместить эту коллекцию ObservableCollection (то есть сделать имена данных в столбцах, а связанные с ними значения в строках) для отображения в WPF ListView.

Вот что у меня получилось:

Private Sub Transpose()
    Dim colGroupedValues = From x In MyBase.Items Group x By Key = x.strDataName Into Group Select strName = Key, colValues = Group
    MyBase.Clear()
    For Each x In colGroupedValues
        MyBase.Add(x)
    Next
End Sub

Естественно, это не работает, поскольку x нельзя добавить в коллекцию ObservableCollection (ItmDataDetails).Любые предложения о том, как это сделать?Я не очень хорошо знаю LINQ, поэтому я не удивлюсь, если пойму, что делаю это неправильно.

Заранее всем спасибо.

1 Ответ

1 голос
/ 11 августа 2010

Так что я думаю, что задавал неправильный вопрос здесь. Что я действительно хотел, так это чтобы каждый столбец в GridView был установлен как часть DataName элемента itmDataDetails, а его соответствующие записи были установлены в DataValue.

Для этого я следовал полезному руководству по адресу: http://weblogs.asp.net/psheriff/archive/2010/03/08/using-a-wpf-listview-as-a-datagrid.aspx

Таким образом, все это заменяется на:

Private Sub FillDataList()
   Dim strConnectionString As String = "INSERT CONNECTION INFO HERE"
   Dim strCommandString As String = "INSERT QUERY HERE"
   Dim objCommand As New OleDb.OleDbCommand(strCommandString)
   Dim objConnection As New OleDb.OleDbConnection(strConnectionString)
   Dim objAdapter As New OleDb.OleDbDataAdapter
   Dim ds As New DataSet

   objConnection.Open()
   objAdapter.SelectCommand = objCommand
   objCommand.Connection = objConnection
   objAdapter.Fill(ds)
   lsvData.View = BuildDataView(ds)
   lsvData.DataContext = ds.Tables(0)
   lsvData.SetBinding(ListView.ItemsSourceProperty, New Binding)
   objConnection.Close()

End Sub

Public Function BuildDataView(ByVal ds As DataSet) As GridView
    Dim gv As New GridView
    For Each item As DataColumn In ds.Tables(0).Columns
        Dim gvc As New GridViewColumn
        gvc.DisplayMemberBinding = New Binding(item.ColumnName)
        gvc.Header = item.ColumnName
        gvc.Width = [Double].NaN
        gv.Columns.Add(gvc)
    Next
    Return gv
End Function

Это дает мне то, что я хотел. Извините за недоразумение, если таковое было. Я все равно приму ответ, который решает эту задачу лучше, чем мое решение (быть благотворительным и т. Д.)

Я также подозреваю, что ядро ​​базы данных здесь не имеет значения, поэтому вы, вероятно, могли бы сделать что-то подобное для баз данных Oracle и т. Д.

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