Hello,
I created a custom column and cell in my grid following the progress-bar example
https://docs.telerik.com/devtools/winforms/controls/gridview/cells/creating-custom-cells
But I have modified it so that I can view either a textBoxElement or a dropDownListElement depending on what data is in the cell. It all seems to work just fine until I scroll the grid. Scrolling visualy shuffles the data in the custom column. I've tried to take the cell-formatting route but without success. Is it possible to achieve this result somehow?
Public Class GridParameterValueElement
Inherits GridDataCellElement
Public Sub New(ByVal column As GridViewColumn, ByVal row As GridRowElement)
MyBase.New(column, row)
End Sub
Private isInitialized As Boolean
Private firstTimeIndexChanged As Boolean = True
Private dropDown As RadDropDownListElement
Private textBox As RadTextBoxElement
Protected Overrides Sub CreateChildElements()
MyBase.CreateChildElements()
dropDown = New RadDropDownListElement() With {
.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDownList
}
textBox = New RadTextBoxElement() With {
.Enabled = True,
.ClickMode = Telerik.WinControls.ClickMode.Press,
.ZIndex = -1
}
If Me.Children.Contains(dropDown) Then Me.Children.Remove(dropDown)
If Me.Children.Contains(textBox) Then Me.Children.Remove(textBox)
Me.Children.Add(dropDown)
Me.Children.Add(textBox)
AddHandler dropDown.SelectedIndexChanged, AddressOf SelectedIndexChanged
AddHandler textBox.TextChanged, AddressOf TextInBoxChanged
'AddHandler textBox.Click, AddressOf TextBox_Click
End Sub
Protected Overrides Sub DisposeManagedResources()
RemoveHandler dropDown.SelectedIndexChanged, AddressOf SelectedIndexChanged
RemoveHandler textBox.TextChanged, AddressOf TextInBoxChanged
MyBase.DisposeManagedResources()
End Sub
'Private Sub TextBox_Click(sender As Object, e As EventArgs)
' Dim test = sender
'End Sub
Public Overrides Sub SetContent()
MyBase.SetContent()
If Me.RowInfo.Cells("DisplayValue").Tag IsNot Nothing Then
If Not Me.isInitialized Then
If Me.Children.Contains(textBox) Then Me.Children.Remove(textBox)
With Me.dropDown
.DataSource = Me.RowInfo.Cells("DisplayValue").Tag
.ValueMember = ("DevelopmentTypeParameterValueId")
.DisplayMember = ("ParameterValue")
End With
End If
If Me.RowInfo.Tag IsNot Nothing Then
RemoveHandler dropDown.SelectedIndexChanged, AddressOf SelectedIndexChanged
dropDown.SelectedIndex = DirectCast(Me.RowInfo.Tag, Integer)
AddHandler dropDown.SelectedIndexChanged, AddressOf SelectedIndexChanged
Else
RemoveHandler dropDown.SelectedIndexChanged, AddressOf SelectedIndexChanged
dropDown.SelectedIndex = -1
AddHandler dropDown.SelectedIndexChanged, AddressOf SelectedIndexChanged
End If
ElseIf Me.Value IsNot Nothing AndAlso Me.Value IsNot DBNull.Value Then
If Not Me.isInitialized Then
If Me.Children.Contains(dropDown) Then Me.Children.Remove(dropDown)
Me.textBox.Text = CStr(Me.Value)
End If
End If
Me.isInitialized = True
End Sub
Protected Overrides ReadOnly Property ThemeEffectiveType() As Type
Get
Return GetType(GridDataCellElement)
End Get
End Property
Public Overrides Function IsCompatible(ByVal data As GridViewColumn, ByVal context As Object) As Boolean
Return TypeOf data Is GridViewParameterValueColumn AndAlso TypeOf context Is GridDataRowElement
End Function
End Class
Public Class GridViewParameterValueColumn
Inherits GridViewDataColumn
Public Sub New(ByVal fieldName As String)
MyBase.New(fieldName)
End Sub
Public Overrides Function GetCellType(ByVal row As GridViewRowInfo) As Type
If TypeOf row Is GridViewDataRowInfo Then
Return GetType(GridParameterValueElement)
End If
Return MyBase.GetCellType(row)
End Function
End Class