2009-02-27 4 views
1

... oder sind C# Listviews wirklich so ein Albtraum zu verwalten?Fehle ich etwas mit meiner ListView Auswahl Ereignisbehandlung

Okay, das Problem, an dem ich arbeite, ist sehr einfach. Oder zumindest scheint es so zu sein:

Ich habe eine Textdatei, die Informationen über Kundenaufträge in separaten Zeilen enthält. Die Datenelemente sind durch Semikolons getrennt.

Meine Form iteriert durch diese Befehle, fügt die Iteminformationen in Hashtabellen ein und fügt jede Hashtabelle in eine Masterhashtabelle ein. Einige zusammengefasste Informationen zu jeder Bestellung (Produkt/Bestellnummer/Kundenname/Kundennummer) werden in meiner Listenansicht durch sortierbare Spalten angezeigt. Unterhalb der Listenansicht befindet sich ein Tab-Steuerelement mit Textfeldern für die bearbeitbaren Teile der Auftragsdetails, die auf drei Registerkarten verteilt sind.

Hier ist, was ich würde passieren mag:

  • Benutzer klickt auf einzelnen Eintrag: Registerkarte Textfelder ausfüllen mit Bestelldetails.
  • Der Benutzer bearbeitet Details in der Registerkarte Steuerung.
  • Benutzer klickt auf einen anderen Auftrag: Bestätigungsmeldung prüft, ob die Änderung festgeschrieben werden soll, wenn "Ja", dann sollten die Details in der relevanten Hashtable und der Anzeige in den Listview-Aktualisierungen gespeichert werden.
  • Der Benutzer wählt mehrere Listenansichtselemente aus: Das oberste Element sollte im Registerkartensteuerelement bearbeitet werden können.
  • Der Benutzer drückt am oberen Rand des Formulars die Schaltfläche "Objekt (e) entfernen": Die Objekte werden aus der Hashtabelle entfernt und das ListView-Steuerelement wird aktualisiert, um das Löschen wiederzugeben. Die Textfelder sind alle über das Registersteuerelement zurückgesetzt.

Dies scheint mir ziemlich normal und vernünftiges Verhalten. Ich vermutete, dass die Verwendung des SelectedIndexChanged-Ereignisses die Möglichkeiten bieten würde, die Daten zu verarbeiten. Das Ereignis wird jedoch zweimal bei jeder Auswahl/Abwahl ausgelöst und es ist nicht immer klar, welche Elemente in der Listenansicht an welchem ​​Punkt aktualisiert werden sollen.

Der Code, um zu testen, welche Art von "Auswahl/Abwahl" gerade stattgefunden hat und zu entscheiden, welche Maßnahmen so ergriffen werden sollten, beginnt ziemlich lang zu werden und ich frage mich nur, ob ich die Dinge zu kompliziert mache.

So:

  • Gibt es eine andere Veranstaltung, die ich meine Funktionalität Ziele nutzen könnten zu erreichen? Oder
  • Gibt es etwas über das SelectedIndexChanged-Ereignis, das ich nicht weiß, das dem Programm helfen würde zu entscheiden, was es an einem bestimmten Punkt tun sollte? Oder
  • Gehe ich gerade in die falsche Richtung?

Irgendwelche Vorschläge, auch solche über das Redesign meines Formulars wären sehr willkommen.

EDIT: Beim Versuch, dieses Problem aus einem anderen Blickwinkel anzugreifen, ändere ich meine Master-Hashtable auf eine sortierte Liste. Der Rest des Problems bleibt gleich.

+0

ist das WPF oder Winforms? – Gishu

Antwort

0

Ohne den Code zu wissen, das ist „beginnen recht lange zu erhalten:“ Ich würde folgendes vorschlagen:

Stellen Sie sicher, Listview1.MultiSelect falsch ist. Verwenden Sie ein Feld (oder eine Eigenschaft) in Ihrem Formular, um das SelectedItem zu verfolgen. Überprüfen Sie in dem Fall, ob die neue ListView1.Selecteditems [0]! = This.SelectedItem

Teil 2: Werfen Sie einen Blick auf die DataGridView und DataTables als eine alternative Lösung. Ihre Daten klingen ziemlich "relational" und die Daten haben eine Menge Filtering/Sorting/Linking Funktionalität. Sie könnten eine Liste als DataSource an ein Grid anhängen oder ein wenig weiter gehen und Ihre Daten in DataTables lesen.

+0

Multiselect muss eingeschaltet sein, fürchte ich. Manchmal möchten wir 90% der Daten verlieren und 90 Datensätze einzeln löschen, macht überhaupt keinen Spaß. Aber die einzelne Datentabelle könnte eine gute Idee sein. Ich werde es untersuchen. –

+0

Yup ... DataTable hat bewiesen, dass weniger Kopfschmerzen die Datenstruktur verursachen. Danke vielmals. –

0

Statt die Benutzeroberfläche zu aktualisieren, wenn SelectedIndexChanged auf den ListView abgefeuert wird, starten Sie ein Timer mit einem kurzen Duration (sagt sie der Standard 100ms), und führen Sie das UI-Updates in den Timer.Tick Handler.

Zum Beispiel:

  1. Ziehen Sie ein ListView und Timer auf Ihre WinForm
  2. hinzufügen Auswahl an die ListView mit dem Designer
  3. Handler hinzufügen für die ListView ‚s SelectedIndexChanged Ereignis und die TimerTick Ereignis
  4. Ersetzen Sie den vorhandenen Code durch:

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    timer1.Start(); 
} 

private string GetIndices() 
{ 
    string indices = ""; 
    foreach (int i in listView1.SelectedIndices) 
    { 
     indices += i.ToString() + ", "; 
    } 

    if (indices.Length > 0) 
    { 
     indices = indices.Substring(0, indices.Length - 2); 
    } 

    return indices; 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    timer1.Stop(); 
    Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + 
     ". Selected indices = " + GetIndices()); 
} 

Das funktioniert, weil die Abwahl und Wieder Auswahl Ereignisse kommen in sehr dichter Folge einander - schneller als die Timer ‚s Duration. Die Verwendung des Timer auf diese Weise bedeutet, dass das Paar als ein einzelnes zusammengesetztes Ereignis behandelt wird.

Ich hoffe, das hilft.

+0

Ich verstehe, warum es zweimal pro Klick auslöst. Sobald die Auswahl aufgehoben wird und die Auswahl erneut ausgewählt wird, werden die Google-Suchen mit Ergebnissen angezeigt, die dies erklären. Zumindest wurde mir das mitgeteilt ... –

+0

Sorry für den Fehler in meinem früheren Beispiel. Ich habe den ursprünglichen Eintrag geändert und hoffe, dass dies besser geeignet ist. –

Verwandte Themen