2013-05-26 17 views
12

Ich möchte Liste der Mitarbeiter Liste im Drop binden, mit Funktion zur automatischen Vervollständigung, damit der Benutzer die richtigen Namen RadComboBoxGroße Datenmengen an eine Combobox binden?

verwenden suchen .i ich zwei Hauptprobleme:

1- Die Liste ist so groß, über 5000 item.so im Browser, um diese große Anzahl von Datenbindung macht es hängen oder so langsam. (Performance-Problem)

nach der Telerik Dokumentation

eine Datenquelle an das Set RadComboBox. Verwenden Sie dazu entweder DataSourceID oder die DataSource-Eigenschaft , und legen Sie die DataTextField-Eigenschaften und die DataValueField-Eigenschaften auf die entsprechenden Felder in der Datenquelle fest. (Beachten Sie, dass Sie bei der Verwendung von DataSource die Eigenschaft für jedes Postback setzen müssen, am besten in Page_Init.) Setzen Sie EnableAutomaticLoadOnDemand auf true.

so muss ich die folgende Methode jedes Mal in 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- Objektverweis nicht auf eine Instanz eines Objekts festgelegt wird, wenn die Auswahl eines Kombinationsfeld einzustellen versucht.

Ich überwinde dieses Problem durch this.


Ich habe über 4 dropdowlists aber jeder muss ein Ereignis binden, in nach, aber ich habe sie alle in den page_init zu binden.

Ich bin dankbar für eine detaillierte Antwort auf dieses Problem.

+1

Sie ausführliche Antwort finden Sie hier: http://demos.telerik.com/aspnet-ajax/combobox/examples/loadondemand/wcf/defaultcs.aspx?# qsf-demo-source –

+0

@YuriyRozhovetskiy: vielen Dank, aber ich möchte wissen, wann die Combobox binden, wenn ich möchte, dass die Combo-Box die Daten nur in bestimmten Fällen binden, um die Leistung zu verbessern? –

Antwort

8

meine Firma hatte ein ähnliches Problem. Am Ende haben wir ein jquery-Objekt namens Select2 verwendet und die Liste lazy geladen. Im Grunde laden wir nur die ersten 10 oder so zur Ladezeit, so dass es schnell geladen werden kann, und wenn der Benutzer über die ersten 10 scrollt, laden wir die nächsten 10 und so weiter. Select2 hat eine Suchfunktion, die den Server anspricht, um basierend auf der Suche eine benutzerdefinierte Liste zurückzugeben.

Das Problem beim Laden von 5000 Elementen auf einmal ist, dass der Browser ewig dauern wird, um sie zu laden, durch sie zu durchlaufen und sie nach Bedarf zu manipulieren. Ich sage nicht "Sie müssen select2 verwenden" RadComboBox kann so etwas haben, das Sie verwenden können.

Viel Glück.

+0

Könnten Sie mir bitte einen Beispielcode in .net geben? Wie behandeln Sie dieses Steuerelement? –

+1

ich bin leider nicht in der lage ein beispiel zu geben. in .Net würden Sie eine Methode erstellen, um die benötigten Daten zu laden. Sie müssten ein wenig Nachforschung über Paging betreiben. Das ist einfach die Idee, einen großen Datensatz zu nehmen und ihn in kleineren, handhabbaren Blöcken zu versenden. Diese Daten müssten über javascript/jquery geladen werden.Sie müssten ein Ereignis erstellen, bei dem die Person, wenn sie zum Ende der Liste scrollt, die nächste Datenseite lädt. Wenn jemand nach etwas sucht, benötigen Sie einen anderen .net-Aufruf, der die Suchdaten zurückgibt. –

+0

Ich fand das mit einer kleinen Google-Suche. Es könnte nützlich sein. http://www.telerik.com/community/code-library/aspnet-ajax/combobox/paging-in-radcombobox-load-on-demand.aspx –

0

Der Einfachheit halber fügen Sie einfach die ersten 15 oder 20 Namen hinzu und wenn Benutzer Typen auf der Combobox, füllen Combobox mit zurückgegebenen Namen aus der Datenbank, aber nicht alle, füllen Sie es mit nur ein paar Namen, so dass der Browser nicht ...

1

Ich empfehle nicht, den Datensatz anzuzeigen, sondern stattdessen in einem Javascript-Objekt speichern. Sie können dann mit dieser Liste von Objekten automatisch vervollständigen. Dies geschieht über jquery, indem ein Selektor verwendet wird und dann eine Auto-Complete-Funktion angewendet wird.

Beispiel:

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; } 
}); 
+0

Ich wollte einen Kommentar hinzufügen, dass der formatItem Teil in Ihrem Dropdown verwendet wird, eine formatierte Zeichenfolge, wie farbige Spannen, etc oder irgendeine Art von CSS/zusätzliche Informationen, aber das Formatelement ist, was in der Box gespeichert werden würde. – Fallenreaper

0

Sie können das gleiche tun wie Google tut. Wenn Sie etwas auf Google schreiben, verschwindet der Text, der nicht mit dem eingegebenen Text übereinstimmt, aber die gleichen bleiben dort. Dies wird Ihre Suche erleichtern, das ist die Antwort.

1

Ich traf auch ein ähnliches Szenario, wo sehr viele Werte an Dropdown-Liste gebunden waren. Neueste Version von Chrome, Firefox und IE konnte das binden, aber auch das dauert etwa Minuten, aber für ältere Version hängt Skript & nie funktioniert.

Anstelle einer benutzerdefinierten Steuerung oder einer Telerik-Rad-Box verwenden wir einen einfachen Ansatz. Wir nehmen Seitengröße als konfigurierbarer Wert (zB 50) und Seitennummer (default 1), Anzahl der Seiten (Gesamtzahl/Seitengröße) und Suchkriterien (Benutzereingabe für die automatische Vervollständigung) als Parameter für den Service, der den Wert zurückgibt und nur Datensätze abruft, die der Seitengröße entsprechen, wie pro Eingabesuchkriterium & Seitenzahl.

Nehmen Sie eine Textbox & binden Sie diesen Serviceaufruf zu Text-Change-Ereignis des Textfelds & Bind-Ausgabe zu Autocomplete Dropdown.

Die Logik für das Paging & Suche wird wie Stored Procedure having Sorting, Paging and Filtering in gespeicherte Prozedur implementiert

Das war einfach, schnell und ziemlich wartbar als jedes clientseitige Paging, Bindung usw.

1

Dropdown-Liste ist nicht gut geeignet für eine vollständige Liste der Mitarbeiter. Jemand muss das Design überdenken.

1

Verwenden Sie ein VirtualizingStackPanel als ItemsPanel für Ihre RadComboBoxen, wenn eine große Anzahl von Elementen angezeigt werden soll. Mit einem VirtualizationStackPanel können Sie zehntausende Objekte in Ihrer RadComboBox haben.

verwenden XAML-Code:

  <!-- 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> 
Verwandte Themen