Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ComboBox mit großer Datenmenge
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

ComboBox mit großer Datenmenge

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.183

beantworten | zitieren | melden

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.
Zitat
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.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.800
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tristar
myCSharp.de - Member



Dabei seit:
Beiträge: 95

Themenstarter:

beantworten | zitieren | melden

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;
            }
        }
private Nachricht | Beiträge des Benutzers