2014-12-19 5 views
0

Первое спасибо за вашу помощь.ComponentOne True DBGrid Создание пользовательских ячеек

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

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

Example of One Custom Column Displayed

Вот если вы дважды щелкните на ячейке я могу получить пользовательский элемент управления, чтобы появиться в камере они кликнули на. Тем не менее, я хочу, чтобы ячейка была видна постоянно, а не только когда она была нажата, и я хочу, чтобы она была основана на самой строке, а не только на 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», как изображения показывают.

Turtorial for Custom 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 

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

+0

Вы считали, что пытаетесь это с помощью FlexGrid. Вначале это может показаться менее интуитивным, но как только вы получите общий смысл, он действительно намного более универсален, чем trueDbGrid. –

+0

Это одна из тех вещей, где у нас уже есть TrueDBGrid, работающий с другими функциями, и мы используем его для каждой таблицы в нашем приложении, поэтому, если бы мы могли избежать этого, я думаю, что это было бы лучше. – Lightbarrier

ответ

0

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

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

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