ComponentOne True DBGrid Создание пользовательских ячеек

Сначала спасибо за вашу помощь.

Это относится к True DBGrid Componentone, так что, возможно, это не лучшее место, чтобы ожидать ответов, но на данный момент я чувствую, что сделал столько, сколько смог, поэтому я готов дать ему шанс.

Последние пару дней я потратил довольно много времени, пытаясь понять, как я могу создать собственные ячейки в True DBGrid, и в настоящее время я застрял. Я просмотрел столько документации, сколько смог найти, и все учебники по True DBGrid, однако самое дальнее, что я могу получить, показано на прикрепленном изображении ниже.

Пример отображения одного пользовательского столбца

Здесь, если вы дважды щелкнете по ячейке, я смогу настроить пользовательский элемент управления в ячейке, по которой щелкнули. Однако я хочу, чтобы ячейка была видна постоянно, а не только при нажатии, и я хочу, чтобы она основывалась на самой строке, а не только на displayColumn, как я делаю сейчас, когда я перезагружаю "DisplayColumn.DataColumn.Editor". каждый раз, когда нажимается другая ячейка. Мой код для этого представления показан ниже.

' Retrieve Column
Dim objPrefDisplayColumn As C1.Win.C1TrueDBGrid.C1DisplayColumn = Me.TestGrid.Splits(0).DisplayColumns("ColumnFieldName")
'Retrieve data from database
Dim data As DataTable = ' My call to database table goes here Retrieve data that relates to row
' Create Custom Controller and Insert Data from table into it
Dim prvNewCellList As New TestCellList
prvNewCellList.LabelButtonHeight = Me.TestGrid.RowHeight / pref.Rows.Count
prvNewCellList.LabelWidth = (objPrefDisplayColumn.Width * 0.9)
prvNewCellList.ButtonWidth = (objPrefDisplayColumn.Width * 0.1)
 prvNewCellList.Action_LoadUI(data)
' Assign Custom Controller to Column
objPrefDisplayColumn.DataColumn.Editor = prvNewCellList
objPrefDisplayColumn.Button = True
objPrefDisplayColumn.ButtonAlways = True
objPrefDisplayColumn.DropDownList = False
objPrefDisplayColumn.DataColumn.DropDown = Nothing

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

Турториал для пользовательских DataGridViewCells

Исходя из того, что я прочитал о TrueDBGrid, и ожидаемой логики, что ComponentOne, скорее всего, использует DataGridView в качестве шаблона для создания TrueDBGrid, я ожидаю, что способ создания пользовательских ячеек будет очень похожим. Однако после попытки воссоздать этот пример с использованием TrueDBGrid, как показано ниже, я обнаружил, что столбцы не принимают "DataGridViewColumn", и когда я попытался изменить его на "C1DataColumn", чтобы оправдать его ожидания, я обнаружил, что у класса нет ничего похожего на поле ". CellTemplate ", который можно использовать для создания пользовательских ячеек. На данный момент я почти готов поверить, что функциональность для пользовательских ячеек была забыта при разработке TrueDBGrid, однако я более чем готов к ошибкам.

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Dim col As New DataGridViewRolloverCellColumn()
            Me.TestGrid.Columns.Add(col)
        Catch ex As Exception
            MsgBox("error arrose", vbInformation, "error")
        End Try
    End Sub
End Class

Public Class DataGridViewRolloverCellColumn
    Inherits DataGridViewColumn

    Public Sub New()
        Me.CellTemplate = New DataGridViewRolloverCell()
    End Sub

End Class

Public Class DataGridViewRolloverCell
    Inherits DataGridViewTextBoxCell

    Protected Overrides Sub Paint( _
    ByVal graphics As Graphics, _
    ByVal clipBounds As Rectangle, _
    ByVal cellBounds As Rectangle, _
    ByVal rowIndex As Integer, _
    ByVal elementState As DataGridViewElementStates, _
    ByVal value As Object, _
    ByVal formattedValue As Object, _
    ByVal errorText As String, _
    ByVal cellStyle As DataGridViewCellStyle, _
    ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _
    ByVal paintParts As DataGridViewPaintParts)

        ' Call the base class method to paint the default cell appearance.
        MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, _
            value, formattedValue, errorText, cellStyle, _
            advancedBorderStyle, paintParts)

        ' Retrieve the client location of the mouse pointer.
        Dim cursorPosition As Point = _
            Me.DataGridView.PointToClient(Cursor.Position)

        ' If the mouse pointer is over the current cell, draw a custom border.
        If cellBounds.Contains(cursorPosition) Then
            Dim newRect As New Rectangle(cellBounds.X + 1, _
                cellBounds.Y + 1, cellBounds.Width - 4, _
                cellBounds.Height - 4)
            graphics.DrawRectangle(Pens.Red, newRect)
        End If
    End Sub
End Class

Спасибо еще раз за помощь

1 ответ

Решение

Через некоторое время я нашел работу вокруг.

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

Private Sub LoadGrid()
    ' Create and Load Common control
    Dim prvsdServiceDelivery As ServiceDelTable = New ServiceDelTable()
    prvsdServiceDelivery.Action_LoadUI(DataTable)
    ' Add Common Control to Datastruct so it can be accessed anytime
    Dictionary.put(key, prvsdServiceDelivery)
    ' insert hosted control into grid
    C1TrueDBGrid.Controls.Add(prvptPreferences)
End Sub

Private Sub TestGrid_Paint(sender As Object, e As PaintEventArgs) Handles TestGrid.Paint

    For Each item As KeyValuePair(Of String, prvsdServiceDelivery) In Dictionary
        Try
            Dim prvsdServiceDelivery as ServiceDelTable  = item.Value

            ' get cell rect, may throw error if cell is outside the bounds of table's rectangle
            Dim bnds As Rectangle = frc1tdOwnerTable.Splits(0).GetCellBounds(row,C1TrueDBGrid.Splits(0).DisplayColumns.IndexOf(column))

            ' Set Visibility and move if error isn't thrown
            prvsdServiceDelivery.Bounds = bnds
            prvsdServiceDelivery.Visible = True
        Catch ex As Exception
            ' Set as invisible if exception thrown to say not found
            prvsdServiceDelivery.Visible = False
        End Try
    Next
End Sub
Другие вопросы по тегам