Laden...

ComboBox mit großer Datenmenge

Erstellt von tristar vor einem Jahr Letzter Beitrag vor einem Jahr 674 Views
T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr
ComboBox mit großer Datenmenge

Hallo zusammen,

ich bräuchte mal wieder einen Ratschlag von Euch.
Ich überarbeite derzeit eine Windows Forms u.a. mit einer Combobox.

Leider besteht das Problem, dass beim

Form_Load

es recht lange (~ 7-8 Sek.) dauert, bis die Daten an die

ComboBox

gebunden sind.
Es sind derzeit ~ 10.500 Datensätze, Tendenz steigend.

Ein Abruf der Daten über eine separate Form ist nicht möglich, da die Nutzer weiterhin mit einer ComboBox arbeiten möchten.
Selbst wenn ich beim Laden der Daten ein Limit setze, dann muss ich ja sobald der Nutzer einen Wert auswählen möchte, die restlichen Daten laden, was dann dauert.

Das Ändern der Reihenfolge,

.DisplayMember

,

ValueMember

und die

DataSource

, um ein Re-Loading der internal List zu vermeiden, hat keinen Effekt.

Was habe ich dann für Möglichkeiten?
Danke!

16.834 Beiträge seit 2008
vor einem Jahr

Welcher exklusive Sinn hat es, dass eine Combobox mit so vielen Werten gefüllt werden muss? Die Devise - in absoluten allen UI Technologien ist - nur das anzuzeigen, was angezeigt werden muss.
Das hat alleine schon Gründe aufgrund von technischen Limits.

Selbst wenn ich beim Laden der Daten ein Limit setze, dann muss ich ja sobald der Nutzer einen Wert auswählen möchte, die restlichen Daten laden, was dann dauert.

Dann lass Dich von anderen Lösungen inspirieren: Combobox mit Suchfeld und die Einträge werden nach der Eingabe nachgeladen.

3.825 Beiträge seit 2006
vor einem Jahr

Ein virtuelles ListView kann man nach Bedarf nachladen, so dauert die Anzeige von mehreren Millionen Datensätzen nur 0,2 Sekunden. Glaubt man.

Ich habe immer ein Suchfeld zum Eingrenzen und dann auf Knopfdruck ein ListView.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

T
tristar Themenstarter:in
98 Beiträge seit 2016
vor einem Jahr

Danke euch für Eure Hilfe!
Soweit bin ich bisher gekommen und funktioniert soweit.


 private void OnTextChanged(object sender, EventArgs e)
        {
            string filter = cbx.Text;
            lbxItems.Visible = false;

            if (String.IsNullOrEmpty(filter)) return;

            List<Baugruppe> lst = FilterBaugruppe(filter);
            if (lst == null) return;

            lbxItems.Items.Clear();
            lbxItems.Items.AddRange(lst.ToArray());
            lbxItems.DisplayMember = "NummerBezeichnung";
            lbxItems.ValueMember = "Nummer";
            lbxItems.Visible = true;
        }

  void OnMouseDoubleClick(object sender, MouseEventArgs e)
        {
            Baugruppe bg = lbxItems.SelectedItem as Baugruppe;
            if (bg != null)
            {
                cbx.Text = bg.NummerBezeichnung;
                lbxItems.Visible = false;
            }
        }

Es gibt aber noch ein paar Kleinigkeiten, wo ich Hilfe bräuchte:


// Ist es möglich (wahrscheinlich schon - nur wie?), den Teil aus dem OnMouseDoubleClick mit dem Keys.Enter Event 
// als eine Methode zu schreiben, sonst habe ich doppelten Code.
 private void cbNummer_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                lbxItems.SelectedIndex = 0;
            }
            if (e.KeyCode == Keys.Enter)
            {
                Baugruppe bg = lbxItems.SelectedItem as Baugruppe;
               if (bg != null)
               {
                   cbx.Text = bg.NummerBezeichnung;
                   lbxItems.Visible = false;
               }
           }
        }

Und der zweite Punkt:
Ich würde gerne mit den Pfeil-Tasten innerhalb der ListBox navigieren.
Hab folgendes versucht, aber das SelectedItem ändert sich nicht. Weshalb?


private void lbxItems_KeyDown(object sender, KeyEventArgs e)
        {
            this.lbxItems.Focus();
            this.lbxItems.Select();

            if (e.KeyCode == Keys.Up)
            {
                if (lbxItems.SelectedIndex > 0)
                    this.lbxItems.SelectedIndex--;
                e.Handled = true;
            }
            else if (e.KeyCode == Keys.Down)
            {
                if (lbxItems.SelectedIndex < (lbxItems.Items.Count - 1))
                    this.lbxItems.SelectedIndex++;
                e.Handled = true;
            }
        }