Привязать большое количество данных к комбинированному списку?

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

У меня две основные проблемы:

1- Список настолько велик, что касается 5000 item. Поэтому привязка этого большого количества данных в браузере делает его зависшим или очень медленным. (Проблема с производительностью)

Согласно документации Telerik

Установите источник данных в RadComboBox. Для этого используйте либо DataSourceID, либо свойство DataSource и задайте для свойств DataTextField и DataValueField соответствующие поля в источнике данных. (Обратите внимание, что при использовании DataSource вы должны устанавливать свойство для каждой обратной передачи, наиболее удобно в Page_Init.) Установите для EnableAutomaticLoadOnDemand значение true.

поэтому я должен вызывать следующий метод каждый раз в Page_Init !!!

  protected void BindInnerInstructors()
    {
        ddl_inner_sup.Items.Clear();
        ddl_inner_sup.DataSource = Utilities.GetAllInnerInstructors();
        ddl_inner_sup.DataValueField = "emp_num";
        ddl_inner_sup.DataTextField = "name";
        ddl_inner_sup.DataBind();
    }

2- Ссылка на объект не установлена ​​на экземпляр объекта при попытке установить выбор поля со списком.

я преодолеваю эту проблему с помощью этого.


У меня есть около 4 выпадающих списков, но каждый из них должен быть привязан в соответствии с событием, но я должен связать их все в page_init.

Буду признателен за развернутый ответ на этот вопрос.


person Anyname Donotcare    schedule 26.05.2013    source источник
comment
Вы можете найти подробный ответ здесь: demos.telerik.com/aspnet-ajax/combobox/examples/loadondemand/   -  person Yuriy Rozhovetskiy    schedule 28.05.2013
comment
@YuriyRozhovetskiy: большое спасибо, но я хочу знать, когда выполняется привязка поля со списком, если я хочу, чтобы поле со списком связывало данные только в конкретном случае для повышения производительности?   -  person Anyname Donotcare    schedule 28.05.2013


Ответы (6)


у моей компании была аналогичная проблема. мы закончили тем, что использовали объект jquery под названием Select2, и мы лениво загружали список. В основном мы загружаем только первые 10 или около того во время загрузки, что ускоряет загрузку, и если пользователь прокручивает вниз после первых 10, мы загружаем следующие 10 и так далее. Select2 имеет функцию поиска, которая обращается к серверу и возвращает настраиваемый список на основе поиска.

Проблема с одновременной загрузкой 5000 элементов состоит в том, что браузеру потребуется бесконечно долго загружать их, выполнять итерацию по ним и при необходимости манипулировать ими. Я не говорю, что "вы должны использовать select2" RadComboBox может иметь что-то подобное, которое вы можете использовать.

Удачи.

person Kenneth Garza    schedule 26.05.2013
comment
Не могли бы вы дать мне образец кода в .net, пожалуйста? Как вы относитесь к этому элементу управления? - person Anyname Donotcare; 26.05.2013
comment
К сожалению, я не могу привести пример. в .Net вы должны создать метод для загрузки необходимых данных. Вам нужно будет провести небольшое исследование разбиения на страницы. Это просто идея взять большой набор данных и отправить его меньшими управляемыми фрагментами. Эти данные необходимо будет загрузить через javascript / jquery. Вам нужно будет создать событие, которое, когда человек прокручивает список до конца, загружает следующую страницу данных. Если кто-то что-то ищет, вам понадобится еще один вызов .net, который возвращает данные поиска. - person Kenneth Garza; 26.05.2013
comment
Я нашел это с помощью небольшого поиска в Google. Может быть полезно. telerik. com / community / code-library / aspnet-ajax / combobox /. - person Kenneth Garza; 26.05.2013
comment
Вернувшись к этому через несколько дней, я вспомнил вопрос, который мне задавали, когда мне приходилось решать эту проблему на работе. Вопрос был в том, как мы можем ожидать, что конечный пользователь прокрутит 5000 элементов? (Я скорректировал число в соответствии с вашей проблемой). Нам пришлось пересмотреть то, что мы пытались сделать. Конечный пользователь, скорее всего, НЕ захочет прокручивать 5000 элементов, чтобы найти один или два, которые они ищут. Итак, с этим вопросом в воздухе вы, возможно, захотите пересмотреть загрузку всех 5000, но вместо этого подойдете к этому под другим углом. - person Kenneth Garza; 30.05.2013
comment
Например, предварительно загруженный список с последними результатами поиска клиентов или что-то в этом роде. Это намного больше работы, но больше ориентировано на конечного пользователя. Удачи с этим. - person Kenneth Garza; 30.05.2013

Я не рекомендую показывать набор данных, а вместо этого сохраняю его в объекте javascript. Затем вы можете выполнить автозаполнение этого списка объектов. Это делается через jquery, используя селектор, а затем применяя к нему функцию автозаполнения.

Пример:

var systems = [{t:"hi",s:"something"}.{t:"hi",s:"something"},{t:"hi",s:"something"}];
$("#s").autocomplete(systems, 
{
width: 300,
formatItem: function(item) 
{ return item.t + item.s; },
formatResult: function(item) 
{ return item.t; }
});
person Fallenreaper    schedule 19.06.2013
comment
Я хотел добавить комментарий о том, что часть formatItem используется в раскрывающемся списке, имеет форматированную строку, например, цветные промежутки и т. Д., Или любой вид CSS / дополнительной информации, но элемент форматирования - это то, что будет сохранено в поле. - person Fallenreaper; 21.06.2013

Я также встречал похожий сценарий, когда очень большое количество значений было привязано к раскрывающемуся списку. Последняя версия Chrome, Firefox и IE смогла связать это, но это тоже займет около минут, но для более старых версий скрипт зависает и никогда не работает.

Вместо того, чтобы использовать какой-либо настраиваемый элемент управления или telerik rad box, мы используем простой подход. Мы принимаем размер страницы в качестве настраиваемого значения (например, 50) и номер страницы (по умолчанию 1), количество страниц (общее количество / размер страницы ) и критерии поиска (пользовательский ввод для автозаполнения) в качестве параметра для службы, возвращающей значение, и выбирает только записи, равные размеру страницы в соответствии с входными критериями поиска и номером страницы.

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

Логика разбиения по страницам и поиска реализована в хранимой процедуре, например Хранимая процедура с сортировкой, разбиением по страницам и фильтрацией

Это было легко, быстро и в значительной степени удобнее в обслуживании, чем любой пейджинг на стороне клиента, привязка и т. Д.

person Pranav Singh    schedule 20.06.2013

Используйте VirtualizingStackPanel в качестве ItemsPanel для ваших RadComboBoxes, если нужно отобразить большое количество элементов. С помощью VirtualizingStackPanel вы можете иметь в своем RadComboBox десятки тысяч элементов.

Используйте этот XAML-код:

            <!-- WPF ItemsControls like ComboBox, ListBox or Menu use a StackPanel as their internal layout panel. 
                 Use a VirtualizingStackPanel for performance. Else the Combobox will freeze!   -->
            <ItemsPanelTemplate x:Key="itemsPanelTemplate">
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>

            <!-- This style specifies how RadComboBoxes look like -->
            <Style TargetType="telerik:RadComboBox">
                <Setter Property="ItemsPanel" Value="{StaticResource itemsPanelTemplate}"/>
            </Style>
person Knasterbax    schedule 27.01.2014

Для простоты просто добавьте первые 15 или 20 имен, и когда пользователь вводит в поле со списком, заполните поле со списком возвращенными именами из базы данных, но не всеми, заполните его только несколькими именами, чтобы браузер не зависал ...

person Mohd. Umar    schedule 16.06.2013

Вы можете делать то же самое, что и Google. Когда вы пишете что-то в Google, текст, который не совпадает с набранным вами, исчезает, но тот же текст останется там. Это упростит вам поиск, вот ответ.

person r.mirzojonov    schedule 20.06.2013