Hi,
I have a RadGridView that has a GridViewComboBoxColumn containing 40,000+ values through data binding. Viewing the combobox values in every cell under that column is taking a few seconds. I think the reason for this sluggishness is because it loads up the values only when a cell is clicked. So I'm wondering if there's any way to optimize this behavior.
Thanks!
I have a RadGridView that has a GridViewComboBoxColumn containing 40,000+ values through data binding. Viewing the combobox values in every cell under that column is taking a few seconds. I think the reason for this sluggishness is because it loads up the values only when a cell is clicked. So I'm wondering if there's any way to optimize this behavior.
Thanks!
3 Answers, 1 is accepted
0
Hi Joemelle,
Thank you for contacting us.
You can implement a custom solution which will fit your needs. I have created a sample class which may get you started:
You can use it as follows:
My BindingClass has a single Property - "Name" and the bindlingCollection is a List<BindingClass>.
I hope this helps.
Regards,
George
Telerik
Thank you for contacting us.
You can implement a custom solution which will fit your needs. I have created a sample class which may get you started:
public
class
MyGridViewComboBoxColumn : GridViewComboBoxColumn
{
private
IList dynamicDataSource;
private
IList actualDataSource;
private
int
dataLoadStep = 100;
private
RadDropDownListEditor comboBoxEditor;
private
RadDropDownListElement editorElement;
private
int
savedScrollPosition;
public
int
DataLoadStep
{
get
{
return
this
.dataLoadStep;
}
set
{
if
(value < 50)
{
throw
new
ArgumentException(
"The DataLoadStep can not be less than 50 so that a scrollbar can be visible after the initial load"
);
}
this
.dataLoadStep = value;
}
}
public
IList ActualDataSource
{
get
{
return
this
.actualDataSource;
}
set
{
this
.actualDataSource = value;
this
.DataSource =
this
.actualDataSource;
}
}
public
IList DynamicDataSource
{
get
{
return
this
.dynamicDataSource;
}
set
{
if
(
this
.actualDataSource ==
null
)
{
throw
new
ArgumentException(
"Add a ActualDataSource first"
);
}
this
.dynamicDataSource = value;
IList dataSource = (IList)
this
.DataSource;
for
(
int
i = dataSource.Count; i <
this
.DataLoadStep; i++)
{
dataSource.Add(
this
.dynamicDataSource[i]);
}
}
}
public
MyGridViewComboBoxColumn(
int
dataLoadStep)
:
this
()
{
this
.DataLoadStep = dataLoadStep;
}
public
MyGridViewComboBoxColumn()
:
base
()
{
}
public
override
void
InitializeEditor(IInputEditor editor)
{
base
.InitializeEditor(editor);
RadDropDownListEditor comboBoxEditor = editor
as
RadDropDownListEditor;
if
(comboBoxEditor !=
null
)
{
this
.comboBoxEditor = comboBoxEditor;
RadDropDownListElement element = (RadDropDownListElement)comboBoxEditor.EditorElement;
if
(element !=
null
)
{
this
.editorElement = element;
element.ListElement.VScrollBar.ValueChanged -= VScrollBar_ValueChanged;
element.ListElement.VScrollBar.ValueChanged += VScrollBar_ValueChanged;
}
}
}
private
void
VScrollBar_ValueChanged(
object
sender, EventArgs e)
{
RadScrollBarElement scroll = (RadScrollBarElement)sender;
if
(scroll.Value + scroll.LargeChange >= scroll.Maximum - 400)
{
this
.savedScrollPosition = scroll.Value;
this
.LoadDataSource();
}
}
private
void
LoadDataSource()
{
IList currentDataSource = (IList)
this
.DataSource;
int
maxCount = currentDataSource.Count +
this
.dataLoadStep;
if
(maxCount <
this
.DynamicDataSource.Count)
{
for
(
int
i = currentDataSource.Count; i < maxCount; i++)
{
object
source =
this
.dynamicDataSource[i];
this
.actualDataSource.Add(source);
}
this
.comboBoxEditor.EndEdit();
this
.InitializeEditor(
this
.comboBoxEditor);
this
.editorElement.ShowPopup();
this
.editorElement.ListElement.VScrollBar.Value =
this
.savedScrollPosition;
}
}
}
You can use it as follows:
MyGridViewComboBoxColumn comboCol =
new
MyGridViewComboBoxColumn();
this
.grid.Columns.Insert(0, comboCol);
comboCol.DisplayMember =
"Name"
;
comboCol.ActualDataSource =
new
List<BindingClass>();
comboCol.DynamicDataSource =
this
.bindingCollection;
My BindingClass has a single Property - "Name" and the bindlingCollection is a List<BindingClass>.
I hope this helps.
Regards,
George
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
0
Joemelle
Top achievements
Rank 1
answered on 04 Sep 2013, 11:02 AM
Thanks for your response. I have tried the code and I think the only downside to this is that if the AutoCompleteMode is set to SuggestAppend wherein if the last item was typed and the combobox has not been scrolled down up to the last item, it would not be autocompleted. Am I right? Or did I just missed a code to fit my requirement?
Thanks!
Thanks!
0
Hello Joemelle,
Thank you for writing back.
That is correct. The combo box column is loading the items from the data source on demand. You can implement your own AutoComplete by searching the ActualDataSource using a CurrencyManager. A simple example would look like this:
I hope this helps.
Regards,
George
Telerik
Thank you for writing back.
That is correct. The combo box column is loading the items from the data source on demand. You can implement your own AutoComplete by searching the ActualDataSource using a CurrencyManager. A simple example would look like this:
public
override
void
InitializeEditor(IInputEditor editor)
{
base
.InitializeEditor(editor);
RadDropDownListEditor comboBoxEditor = editor
as
RadDropDownListEditor;
if
(comboBoxEditor !=
null
)
{
this
.comboBoxEditor = comboBoxEditor;
RadDropDownListElement element = (RadDropDownListElement)comboBoxEditor.EditorElement;
if
(element !=
null
)
{
this
.editorElement = element;
element.ListElement.VScrollBar.ValueChanged -= VScrollBar_ValueChanged;
element.ListElement.VScrollBar.ValueChanged += VScrollBar_ValueChanged;
((RadDropDownListEditorElement)element.EditorElement).EditableElement.TextBox.KeyPress += TextBox_KeyPress;
((RadDropDownListEditorElement)element.EditorElement).EditableElement.TextBox.KeyPress += TextBox_KeyPress;
}
}
}
void
TextBox_KeyPress(
object
sender, KeyPressEventArgs e)
{
if
(
char
.IsDigit(e.KeyChar) ||
char
.IsLetter(e.KeyChar))
{
CurrencyManager manager =
this
.OwnerTemplate.BindingContext[
this
.ActualDataSource]
as
CurrencyManager;
if
(manager !=
null
)
{
this
.editorElement.BeginUpdate();
PropertyDescriptorCollection descriptors = manager.GetItemProperties();
PropertyDescriptor descriptor = descriptors.Find(
this
.DisplayMember,
true
);
RadDropDownListEditorElement editor = sender
as
RadDropDownListEditorElement;
for
(
int
i = 0; i <
this
.ActualDataSource.Count; i++)
{
manager.Position = i;
string
value = (
string
)descriptor.GetValue(
this
.actualDataSource[i]);
//do some autoCompleteLogic
}
this
.editorElement.EndUpdate();
}
}
}
I hope this helps.
Regards,
George
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>