Hello Telerik
I would like to have an editor in a GridView for selecting one business object (DataBase Key, Name, Code (like an EAN CODE) in a collection. As The name is also considered to be an unique Key, the editor is based on a textbox which display the name of a product. The textbox should have a autocomplete feature (suggest with a dropdown) but the suggestion should be based on the whole list of product filtered by the Name or the Code.
The editor is valid only if the text is matching a product name (return the matching DataBase key for the binding) or is empty (return a nullvalue for binding).
What is the best way to reach this objectif ? Should I start from a RadDropDownListEditor, a RadTextBoxControlEditor, a RadTextBoxEditor ?
Thanks for your support
6 Answers, 1 is accepted
Thank you for writing.
RadGridView provides different columns types one of which is GridViewComboBoxColumn. It displays a set of predefined candidate text values in a drop down list and it is typically used to provide a lookup into some set of relatively static values. GridViewComboBoxColumn provides flexible auto-completion options that suggest and append text from choices in the list as the user types. It can be controlled by the GridViewComboBoxColumn.AutoCompleteMode property.
I hope this information helps. Should you have further questions I would be glad to help.
Regards,
Dess
Telerik

Hello Dess,
Thank you for answering.
I have made a custom GridViewComboBoxColum and a Custom AutoCompleteSuggestHelper according the documentation you linked.
Friend Class GridViewInstrumentColumn    Inherits GridViewComboBoxColumn    Public Overrides Sub InitializeEditor(editor As Telerik.WinControls.UI.IInputEditor)        MyBase.InitializeEditor(editor)        Dim AutocompleteEditor = TryCast(editor, RadDropDownListEditor)        If AutocompleteEditor IsNot Nothing Then            Dim editorElement As RadDropDownListEditorElement = TryCast(AutocompleteEditor.EditorElement, RadDropDownListEditorElement)            editorElement.AutoCompleteDataSource = Me.DataSource            editorElement.AutoCompleteDisplayMember = "Name"            editorElement.AutoCompleteMode = AutoCompleteMode.Suggest            editorElement.AutoCompleteSuggest = New InstrumentAutoCompleteSuggestHelper(editorElement)        End If    End Sub    Private Class InstrumentAutoCompleteSuggestHelper        Inherits AutoCompleteSuggestHelper        Public Sub New(owner As RadDropDownListElement)            MyBase.New(owner)        End Sub        Protected Overrides Function DefaultFilter(item As Telerik.WinControls.UI.RadListDataItem) As Boolean            Dim data As CastorModel.Instrument = TryCast(item.DataBoundItem, CastorModel.Instrument)            If data IsNot Nothing Then                Return (Not IsNothing(data.Name) AndAlso data.Name.IndexOf(Me.Filter, StringComparison.CurrentCultureIgnoreCase) > -1) OrElse                    (Not IsNothing(data.Bloomberg_Ticker) AndAlso data.Bloomberg_Ticker.IndexOf(Me.Filter, StringComparison.CurrentCultureIgnoreCase) > -1) OrElse                    (Not IsNothing(data.ISIN) AndAlso data.ISIN.IndexOf(Me.Filter, StringComparison.CurrentCultureIgnoreCase) > -1)            Else                Return MyBase.DefaultFilter(item)            End If        End Function    End ClassEnd Class
It's look the suggestion are well filtred but I have some strange behavior on the editor. The text is mixed with a value of the datasource and my typing.
Any idea how to avoid this ?
Thank you for writing back.
I have succeeded to replicate the text mixing when typing. However, note that it is redundant to set the DataSource of the RadDropDownListEditorElement because it is already set to the column. When I initialize the custom column like below, the text seems to behave as expected:
Sub New()    InitializeComponent()    Dim comboCol As New GridViewInstrumentColumn()    comboCol.DataSource = Me.CategoriesBindingSource    comboCol.DisplayMember = "CategoryName"    comboCol.ValueMember = "CategoryID"    comboCol.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown    comboCol.AutoCompleteMode = AutoCompleteMode.Suggest    comboCol.FieldName = "CategoryID"    comboCol.MinWidth = 300    Me.RadGridView1.Columns.Add(comboCol)    Me.RadGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.FillEnd SubFriend Class GridViewInstrumentColumnInherits GridViewComboBoxColumn    Public Overrides Sub InitializeEditor(editor As Telerik.WinControls.UI.IInputEditor)        MyBase.InitializeEditor(editor)        Dim AutocompleteEditor = TryCast(editor, RadDropDownListEditor)        If AutocompleteEditor IsNot Nothing Then            Dim editorElement As RadDropDownListEditorElement = TryCast(AutocompleteEditor.EditorElement, RadDropDownListEditorElement)             editorElement.AutoCompleteSuggest = New InstrumentAutoCompleteSuggestHelper(editorElement)        End If    End Sub         Private Class InstrumentAutoCompleteSuggestHelper    Inherits AutoCompleteSuggestHelper        Public Sub New(owner As RadDropDownListElement)            MyBase.New(owner)        End Sub        Protected Overrides Function DefaultFilter(item As Telerik.WinControls.UI.RadListDataItem) As Boolean            Dim data As DataRowView = TryCast(item.DataBoundItem, DataRowView)            If data IsNot Nothing Then                Return (Not IsNothing(data.Row("CategoryName")) AndAlso _                data.Row("CategoryName").IndexOf(Me.Filter, StringComparison.CurrentCultureIgnoreCase) > -1)            Else                Return MyBase.DefaultFilter(item)            End If        End Function    End ClassEnd ClassI hope this information helps. If you have any additional questions, please let me know.
Regards,
Dess
Telerik

Hello Dess,
When I remove the datasource on the editorElement, the item in the RadListDataItem parameter in the DefaultFilter is not bound anymore. Then I can only access and process the custom filter with the text value. Are you sure that in your sample you don't go on MyBase.DefaultFilter(item) ?
Thank you for writing back.
Indeed, in this case, the RadListDataItem is not bound. I have modified the code snippet in a way to access the data source and find the relevant record for the filter functionality without binding the autocomplete items:
Sub New()     InitializeComponent()     Dim comboCol As New GridViewInstrumentColumn()    comboCol.DataSource = Me.CategoriesBindingSource    comboCol.DisplayMember = "CategoryName"    comboCol.ValueMember = "CategoryID"    comboCol.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDown    comboCol.AutoCompleteMode = AutoCompleteMode.Suggest    comboCol.FieldName = "CategoryID"    comboCol.MinWidth = 300    Me.RadGridView1.Columns.Add(comboCol)     Me.RadGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill    AddHandler Me.RadGridView1.CellEditorInitialized, AddressOf CellEditorInitializedEnd SubPrivate Sub CellEditorInitialized(sender As Object, e As GridViewCellEventArgs)    Dim AutocompleteEditor = TryCast(e.ActiveEditor, RadDropDownListEditor)    If AutocompleteEditor IsNot Nothing Then        Dim editorElement As RadDropDownListEditorElement = TryCast(AutocompleteEditor.EditorElement, RadDropDownListEditorElement)         editorElement.AutoCompleteMode = AutoCompleteMode.Suggest        editorElement.AutoCompleteSuggest = New InstrumentAutoCompleteSuggestHelper(editorElement, Me.CategoriesBindingSource)      End IfEnd SubPrivate Class InstrumentAutoCompleteSuggestHelperInherits AutoCompleteSuggestHelper    Dim ds As DataSet    Public Sub New(owner As RadDropDownListElement, dataSource As BindingSource)        MyBase.New(owner)        ds = dataSource.DataSource    End Sub    Protected Overrides Function DefaultFilter(item As Telerik.WinControls.UI.RadListDataItem) As Boolean                    Dim data As DataRow = Nothing        For Each row As DataRow In ds.Tables(0).Rows            If row(Me.Owner.ValueMember) = item.Value Then                data = row            End If        Next        If data IsNot Nothing Then            Return (Not IsNothing(data("CategoryName")) AndAlso _            data("CategoryName").IndexOf(Me.Filter, StringComparison.CurrentCultureIgnoreCase) > -1)        Else            Return MyBase.DefaultFilter(item)        End If    End FunctionEnd ClassI hope this information helps. If you have any additional questions, please let me know.
Regards,
Dess
Telerik

Hello Dess
Coming back from holiday. Adding a reference to the datasource and searching the full object from the value member is working fine.
I hope that the extra load for searching the full object won't become a performance issue when the combobox datasource with the "real list" instead of my 10 test items.
Thank you very much for all your support
Marco
