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», как показано на изображениях.

Учебное пособие по пользовательским ячейкам DataGridViewCell

Основываясь на том, что я читал о 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

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


person Lightbarrier    schedule 19.12.2014    source источник
comment
Рассматривали ли вы возможность попробовать это с FlexGrid. Поначалу он может показаться менее интуитивным, но как только вы поймете его общий смысл, он действительно станет гораздо более универсальным, чем trueDbGrid.   -  person Dom Sinclair    schedule 19.12.2014
comment
Это одна из тех вещей, где у нас уже есть TrueDBGrid, работающий с другими функциями, и мы используем его для каждой таблицы в нашем приложении, поэтому, если бы мы могли избежать этого, я думаю, это было бы лучше.   -  person Lightbarrier    schedule 20.12.2014


Ответы (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
person Lightbarrier    schedule 02.01.2015