2010-08-11 2 views
1
Согласовать

У меня есть пользовательский класс элемента (в основном два строковых значения с соответствующими свойствами), как показано ниже:VB.NET с помощью LINQ транспонировать ObservableCollection

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 

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

Заранее благодарю всех.

+0

Не следует ли это обрабатывать в WPF вместо вашего бэкэнда? –

+0

Если вы знаете, как это сделать, пожалуйста, расскажите. – Riddari

ответ

1

Так что я думаю, что задал здесь неправильный вопрос. Я действительно хотел, чтобы каждый столбец в 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 и т. д.

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