Marci_xxx Ответов: 2

Как показать свойство структуры в ячейке datagridview с помощью пользовательского класса datasource


Привет У меня есть этот код там где есть
- список (класса) (класс это со структурой внутри)
- datagridview, который привязан к классу

Когда я запускаю код, я вижу, что ячейка первого и второго столбцов заполнена правильно.
Но в третьем столбце ячейки заполнены с 'форму form1.schoolSubjects, но я хочу увидеть обычное свойство''.
И когда я наведу курсор мыши на ячейки третьего столбца, я хочу увидеть custmized значение 'toString'.

Я заглянул в интернет и обнаружил, что помощь может прийти от
Система.ComponentModel.значение DisplayName
или от
Система.ComponentModel.Интерфейс icustomtypedescriptor

Но я не понимаю, как.

P.S. Я знаю, что есть способ заставить его изменить значение ячеек во время выполнения (т. е. изменить вывод события cellPaint), но я хочу напрямую привязать правильный вывод из кодов классов или структур.

Вот код
Public Class Form1
    Dim dgv As DataGridView
    Dim classe As List(Of students)
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Size = New Size(400, 200)
        dgv = New DataGridView
        dgv.Size = New Size(Me.Size.Width - 10, Me.Size.Height - 20)
        dgv.Location = New Point(0, 0)

        Me.Controls.Add(dgv)
        classe = New List(Of students) From {New students("John", "Brown", New schoolSubjects(4, 10, 8, 5)), New students("James", "Morrison", New schoolSubjects(3, 4, 10, 2))}
        dgv.DataSource = classe
    End Sub
End Class

Public Class students
    Sub New(ByVal StudentFirstName As String, ByVal StudentSecondName As String, ByVal StudentSubjects As schoolSubjects)
        firstName = StudentFirstName
        secondName = StudentSecondName
        Subjects = New schoolSubjects(StudentSubjects.Mathematics, StudentSubjects.English, StudentSubjects.ModernLanguage, StudentSubjects.Science)
    End Sub
    Public Property firstName As String
    Public Property secondName As String
    Public Property Subjects As schoolSubjects
End Class

Public Structure schoolSubjects
    Sub New(ByVal MathematicsVote As Integer, ByVal EnglishVote As Integer, ByVal LanguageVote As Integer, ByVal ScienceVote As Integer)
        Mathematics = MathematicsVote
        English = EnglishVote
        ModernLanguage = LanguageVote
        Science = ScienceVote
        Average = (Mathematics + English + ModernLanguage + Science) / 4
        tostring = String.Concat("Mathematics: ", Mathematics.ToString, vbCrLf, _
                                 "English: ", English.ToString, vbCrLf, _
                                 "ModernLanguage: ", ModernLanguage.ToString, vbCrLf, _
                                 "Science: ", Science.ToString)
    End Sub
    Public Property Mathematics As Integer
    Public Property English As Integer
    Public Property ModernLanguage As Integer
    Public Property Science As Integer
    Public Property Average As Integer
    Public Shadows Property tostring As String
End Structure


Есть решение?

Что я уже пробовал:

Я пытался
<System.ComponentModel.DisplayName("Average")>
    Public Property Subjects As schoolSubjects

но я должен понять, если это правильный путь и как его установить.

2 Ответов

Рейтинг:
8

Marci_xxx

Хорошо, я нашел решение, которое искал

Public Overrides Function tostring() As String
        Return Average.ToString
    End Function


А для всплывающей подсказки просто вызовите событие в dataGridViewCellMouseEnter.
Private Sub dgv_CellEnter(sender As Object, e As DataGridViewCellEventArgs)
        If e.RowIndex = -1 Then Exit Sub
        Select Case dgv.Columns(e.ColumnIndex).Name
            Case "Subjects"

                dgv.Rows(e.RowIndex).Cells(2).ToolTipText = classe(e.RowIndex).Subjects.Details
        End Select
    End Sub


Вы можете сохранить свойство (т. е. детали) и вызвать значение, вызывающее это событие.
Это полная структура.
Public Structure schoolSubjects
    Sub New(ByVal MathematicsVote As Integer, ByVal EnglishVote As Integer, ByVal LanguageVote As Integer, ByVal ScienceVote As Integer)
        Mathematics = MathematicsVote
        English = EnglishVote
        ModernLanguage = LanguageVote
        Science = ScienceVote
        Average = Math.Round((Mathematics + English + ModernLanguage + Science) / 4, 1)
        Details = String.Concat("Mathematics: ", Mathematics.ToString, vbCrLf, _
                                "English: ", English.ToString, vbCrLf, _
                                 "ModernLanguage: ", ModernLanguage.ToString, vbCrLf, _
                                 "Science: ", Science.ToString, vbCrLf, vbCrLf, _
                                 "Average: ", Average.ToString)
    End Sub
    Public Property Mathematics As Integer
    Public Property English As Integer
    Public Property ModernLanguage As Integer
    Public Property Science As Integer
    Public Property Average As Double
    Public Property Details As String
    Public Overrides Function tostring() As String
        Return Average.ToString
    End Function

End Structure


Рейтинг:
2

Marci_xxx

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

<System.ComponentModel.Browsable(False)>
    Public Property Subjects As schoolSubjects
    Public ReadOnly Property Average As Integer
        Get
            Return Subjects.Average
        End Get
    End Property


Не уверен, что это самое лучшее, потому что я:
- добавьте свойство "среднее", которое вызывает к значению уже существующие "субъекты".Средняя ' недвижимость
- "скрыть" свойство "субъекты" в DataGridView.

Надеюсь, что кто-то сможет получить лучшее решение (просто свяжите значение 'Subjects.Средняя ' собственность).