2013-05-18 2 views
0

У меня есть объект ArrayList (например, Employees).Как отображать элементы второго класса в Datagridview

Сотрудник класса Свойства:

  • имя (String),
  • электронной почты (String),
  • телефон (String),
  • рабочая группа (Workgroup)

Класс Employee имеет свойство Workgroup, которое содержит объект Workgroup-объекта:

Workgroup Класс Свойства:

  • имя (String),
  • электронной почты (String)).

Я попытался отобразить все значения и установите DataPropertyName столбцов для этих значений:

  • "имени",
  • "электронной почты",
  • " телефон ",
  • " workgroup.name ",
  • " рабочая группа.email ".

Но это не работает для свойств рабочей группы.

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

У меня есть много объектов с похожими отношениями в моем проекте и вы хотите перенести из datatables с родным sql в объект-реляционный-mapper, такой как nhibenate. Поэтому было бы очень дорого писать дополнительные классы-сопоставления для всех представлений. Я также программирую в java с Eclipse, и там я могу решить эту проблему с помощью интерфейса ITableLabelProvider.

+0

Можете ли вы быть более конкретным, чем «это не сработало». Например, вы получаете сообщения об ошибках в окне вывода отладчика? – ChrisF

+0

«это не сработало» означает, что указанные столбцы остаются пустыми. Это не вызвало никаких ошибок. –

+0

Рад, что вы нашли решение. но не могли бы вы разместить его в качестве ответа. Тогда вы можете принять его, чтобы показать, что проблема решена. – ChrisF

ответ

0

Я нашел решение:

я добавить адаптированный DataGridViewTextBoxCell:

Public Class SpecialDataGridViewTextBoxCell 
    Inherits DataGridViewTextBoxCell 

    Public Sub New() 
     MyBase.new() 
    End Sub 

    'Overriding basic function 
    Protected Overrides Function GetFormattedValue(_ 
      ByVal value As Object, _ 
      ByVal rowIndex As Integer, _ 
      ByRef cellStyle As DataGridViewCellStyle, _ 
      ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _ 
      ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, _ 
      ByVal context As DataGridViewDataErrorContexts _ 
     ) As Object 
     Dim dataproperty As String = Me.OwningColumn.DataPropertyName 
     If Not dataproperty Is Nothing AndAlso dataproperty.IndexOf(".") > 0 Then 
      If value Is Nothing Then 
       Return getValueByDottedProperty(Me.OwningRow.DataBoundItem, dataproperty) 
      Else 
       Return getValueByDottedProperty(value, dataproperty) 
      End If 
     Else 
      Return MyBase.GetFormattedValue(value, rowIndex, cellStyle, valueTypeConverter, formattedValueTypeConverter, context) 
     End If 
    End Function 

    Private Function getValueByDottedProperty(ByVal obj As Object, ByVal dataPropertyName As String) As String 
     If Not obj Is Nothing AndAlso Not obj Is System.DBNull.Value Then 
      If Not dataPropertyName Is Nothing AndAlso dataPropertyName.Length > 0 AndAlso dataPropertyName.IndexOf(".") > 0 Then 
       Dim part1 As String = dataPropertyName.Substring(0, dataPropertyName.IndexOf(".")) 
       Dim part2 As String = dataPropertyName.Substring(dataPropertyName.IndexOf(".") + 1) 
       Dim val As Object = getPropertyFromObject(obj, part1) 
       If Not val Is Nothing AndAlso Not val Is System.DBNull.Value Then 
        Return getValueByDottedProperty(val, part2) 
       Else 
        Return "" 
       End If 
      Else 
       Dim val As Object = getPropertyFromObject(obj, dataPropertyName) 
       If Not val Is Nothing AndAlso Not val Is System.DBNull.Value Then 
        Return val.ToString 
       Else 
        Return "" 
       End If 
      End If 
     Else 
      Return "" 
     End If 
    End Function 

    Private Function getPropertyFromObject(ByVal obj As Object, ByVal propertyName As String) As Object 
     Dim pInfo As System.Reflection.PropertyInfo = obj.GetType.GetProperty(propertyName) 
     If pInfo Is Nothing Then 
      Return Nothing 
     End If 
     Dim val As Object = pInfo.GetValue(obj, Nothing) 
     Return val 
    End Function 

End Class 

Я добавил функцию, чтобы сгенерировать DatagridViewTextBoxColumn:

Public Shared Function createSpecialDataGridViewTextBoxColumn(ByVal headername As String, ByVal datapropertyname As String) As DataGridViewTextBoxColumn 
    Dim specialTextBoxColumn As New DataGridViewTextBoxColumn() 
    With specialTextBoxColumn 
     .DataPropertyName = datapropertyname 
     .HeaderText = headername 
     .CellTemplate = New SpecialDataGridViewTextBoxCell 
    End With 
    Return specialTextBoxColumn 
End Function 

Затем я установил адаптированный DataGridViewTextBoxCell как CellTemplate в DatagridVieColumn:

With Me.DataGridView1 
    .AutoGenerateColumns = False 
    .Columns.Clear() 
    .Columns.Add(createSpecialDataGridViewTextBoxColumn("Name", "name")) 
    .Columns.Add(createSpecialDataGridViewTextBoxColumn("Email", "email")) 
    .Columns.Add(createSpecialDataGridViewTextBoxColumn("Telephone", "telephone")) 
    .Columns.Add(createSpecialDataGridViewTextBoxColumn("Name (Wrkgrp)", "workgroup.name")) 
    .Columns.Add(createSpecialDataGridViewTextBoxColumn("Email (Wrkgrp.)", "workgroup.email")) 
End With 
0
Friend Class Employee 
    Public name As String 
    Public Phone As String 
    Public Email As String 
    Private oWorkGroup As workGroup 

    Public Property WorkGroupEmail As String 
     Get 
      Return oWorkGroup.Email 
     End Get 
     Set(value As String) 
      oWorkGroup.Email = value 
     End Set 
    End Property 
    Public Property WorkGroupName As String 
     Get 
      Return oWorkGroup.Name 
     End Get 
     Set(value As String) 
      oWorkGroup.Name = value 
     End Set 
    End Property 
End Class 

Будет ли это работать на вас?Создание свойств для отображения свойств WorkGroup

+0

Это будет работать для этого примера, но я ищу универсальное решение. У меня в моем проекте около 90 различных объектов, которые связаны с другим, как в примере выше. Я предпочитаю решение с расширенной DataGridViewColumn, которая может обрабатывать этот тип DataProperties. –

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