开发者

VB.NET using LINQ to transpose an ObservableCollection

I have a custom item class (basically two string values with associated properties), as below:

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

and an ObservableCollection wrapper class around this. I'd like to transpose this ObservableCollection (that is, make the data names into the columns and their associated values into the rows) for display in a WPF ListView.

Here's what I have so far:

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

Naturally, this doesn't work as x cannot be added to the ObservableCollection(Of itmDataDetails). Any suggestions on how to accomplish this? I don't know LINQ that well, so I wouldn't be surprised to discover I'm doing it wrong.

Thanks in advance, everyone.


So I think I was asking the wrong question here. What I really wanted was to have each column in a GridView be set to the DataName part of itmDataDetails and its corresponding records be set to the DataValue.

To do this, I followed the helpful guide at: http://weblogs.asp.net/psheriff/archive/2010/03/08/using-a-wpf-listview-as-a-datagrid.aspx

So the whole thing is replaced by:

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

This gives me what I wanted. Sorry for the misunderstanding, if there was any. I'll still accept an answer that does this task better than my solution (to be charitable, etc.)

I also suspect that the database engine doesn't matter here, so you could probably do something similar for Oracle databases, etc.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜