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