Как назначить свойство класса как отображаемый элемент данных в представлении данных - PullRequest
1 голос
/ 15 июня 2010

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

Мои классы выглядят следующим образом:

class Category
   property UIN as integer
   property Name as string
end class

class item
   property uin as integer
   property name as string
   property mycategory as category
end class

мой список данных выглядит следующим образом:

dim myDataList as list(of Item) = new List(of Item)
myDataList.Add(new Item(1,"item1",new category(1,"cat1")))
myDataList.Add(new Item(2,"item2",new category(1,"cat1")))
myDataList.Add(new Item(3,"item3",new category(1,"cat1")))
myDataList.Add(new Item(4,"item4",new category(2,"cat2")))
myDataList.Add(new Item(5,"item5",new category(2,"cat2")))
myDataList.Add(new Item(6,"item6",new category(2,"cat2")))

Теперь я связал элемент управления datagridview следующим образом:

DGVMain.AutoGenerateColumns = False
DGVMain.ColumnCount = 3
DGVMain.Columns(0).DataPropertyName = "UIN"
DGVMain.Columns(0).HeaderText = "ID"
DGVMain.Columns(1).DataPropertyName = "Name"
DGVMain.Columns(1).HeaderText = "Name"
DGVMain.Columns(2).DataPropertyName = "" **'here i want my category name**
DGVMain.Columns(2).HeaderText = "category"

DGVMain.datasource = myDataList
DGVMain.refresh()

Я попытался использовать mycategory.name, но это не сработало.Что можно сделать, чтобы получить ожидаемый результат?Есть ли лучшая идея, кроме этой, чтобы выполнить ту же задачу?

Отредактировано Мой вопрос в соответствии с комментарием:

Я проверил ссылку, предоставленную вами.Это было приятно и очень полезно.Так как код был в C #, я попытался преобразовать его в VB.Все прошло хорошо, но не получилось, с точки зрения регистра, и следующим было то, что у меня была вложенная категория namecategory и мое свойство name было category.там это вызывает проблему.он не искал категорию, но он искал предметную категорию.так запутался в этом.Мой код выглядит следующим образом:

Private Sub DGVMain_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DGVMain.CellFormatting
    Dim DGVMain As DataGridView = CType(sender, DataGridView)
    e.Value = EvaluateValue(DGVMain.Rows(e.RowIndex).DataBoundItem, DGVMain.Columns(e.ColumnIndex).DataPropertyName)
End Sub

Private Function EvaluateValue(ByRef myObj As Object, ByRef myProp As String) As String
    Dim Ret As String = ""
    Dim Props As System.Reflection.PropertyInfo()
    Dim PropA As System.Reflection.PropertyInfo
    Dim ObjA As Object

    If myProp.Contains(".") Then

        myProp = myProp.Substring(0, myProp.IndexOf("."))
        Props = myObj.GetType().GetProperties()

        For Each PropA In Props

            ObjA = PropA.GetValue(myObj, New Object() {})
            If ObjA.GetType().Name = myProp Then

                Ret = EvaluateValue(ObjA, myProp.Substring(myProp.IndexOf(".") + 1))
                Exit For

            End If

        Next

    Else

        PropA = myObj.GetType().GetProperty(myProp)
        Ret = PropA.GetValue(myObj, New Object() {}).ToString()

    End If

    Return Ret
End Function

Ответы [ 2 ]

0 голосов
/ 15 июня 2010
Public Class Category
    Dim uni As Integer
    Dim name As String
    Public Sub New(ByVal i As Integer, ByVal n As String)
        Me.UIN = i
        Me.name = n
    End Sub
    Public Sub New()

    End Sub
    Property UIN() As Integer
        Get
            Return uni


        End Get
        Set(ByVal value As Integer)
            uni = value

        End Set
    End Property
    Property Names() As String
        Get
            Return Me.name

        End Get
        Set(ByVal value As String)
            Me.name = value
        End Set
    End Property
    **Public Overrides Function ToString() As String
        Return name.ToString()
    End Function**
End Class

Public Class item
    Dim uni As Integer
    Dim name As String
    Dim category As New Category()

    Property UIN() As Integer
        Get
            Return uni


        End Get
        Set(ByVal value As Integer)
            uni = value

        End Set
    End Property
    Property Names() As String
        Get
            Return Me.name

        End Get
        Set(ByVal value As String)
            Me.name = value
        End Set
    End Property
    Property mycategory() As Category
        Get
            Return Me.category
        End Get
        Set(ByVal value As Category)
            Me.category = value
        End Set
    End Property
    Public Sub New(ByVal i As Integer, ByVal nm As String, ByVal ct As Category)
        Me.UIN = i
        Me.Names = nm
        Me.mycategory = ct
    End Sub
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim myDataList As List(Of item) = New List(Of item)
    myDataList.Add(New item(1, "item1", New Category(1, "cat1")))
    myDataList.Add(New item(2, "item2", New Category(1, "cat1")))
    myDataList.Add(New item(3, "item3", New Category(1, "cat1")))
    myDataList.Add(New item(4, "item4", New Category(2, "cat2")))
    myDataList.Add(New item(5, "item5", New Category(2, "cat2")))
    myDataList.Add(New item(6, "item6", New Category(2, "cat2")))


    DGVMain.AutoGenerateColumns = False
    DGVMain.ColumnCount = 3
    DGVMain.Columns(0).DataPropertyName = "UIN"
    DGVMain.Columns(0).HeaderText = "ID"
    DGVMain.Columns(1).DataPropertyName = "Names"
    DGVMain.Columns(1).HeaderText = "Name"
    **DGVMain.Columns(2).DataPropertyName = "mycategory"**
    DGVMain.Columns(2).HeaderText = "Category"

    DGVMain.datasource = myDataList
    DGVMain.refresh()
End Sub
0 голосов
/ 15 июня 2010

Я бы просто добавил к item свойство с именем CategoryName, которое возвращает Category.Name, и использовал бы это.

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

Редактировать: В ответ на ваш комментарий

Если вы не хотите создавать свойства, как указано в моем ответе выше, я не думаю, что есть какие-либореальное решение, но вы можете использовать событие CellFormatting, чтобы заставить его работать, где вы устанавливаете DataPropertyName для специального идентификатора, а затем в обработчике события CellFormatting вы ищете действительное значение для отображения.Вы можете найти пример этого здесь , ищите сообщение tkrasinger (или сообщение AlexHinton, если вы хотите использовать отражение).

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