Laden...

DatePicker SelectedDate_changed löst Selection_Changed von Listbox aus

Erstellt von Zaziggi vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.076 Views
Z
Zaziggi Themenstarter:in
12 Beiträge seit 2020
vor 4 Jahren
DatePicker SelectedDate_changed löst Selection_Changed von Listbox aus

Hallo liebe Gemeinde,

ich quäl mich hiermit schon seit Tagen, ich bitte um Hilfe.

Die SelectedDate_changed-Methode eines Datepickers löst eine Query aus, die mir die KundenNamen(die an diesem Tag gekauft haben) des gewählten Datums in eine Listbox schreibt. Ein Klick auf einen Kundennamen löst eine weitere Query über Kundendetails aus, die in weitere Listboxen geschrieben werden und weitere Aktionen auslösen, wenn man ein detail anklickt.

Wenn ich nun ein anderes Datum auswähle, wird auch dummerweise die Selection_changed Methode der Kundennamen-ListBox ausgelöst, was zu Problemen führt. Wähle ich keinen Kunden aus und ändere das Datum, tritt kein Fehler auf, nur wenn bereits ein Kunde ausgewählt wurde.

Wie kann ich das verhindern?

lg

Zaziggi

T
2.224 Beiträge seit 2008
vor 4 Jahren

Wie sieht den der bisherige Code aus?
Ohne Code ist es schwer die Ursachen zu finden.
Gibt es ggf. einen direkten Aufruf des Events für die Listbox oder wird ggf. beim neubinden der Liste ein Eintrag ausgewählt, was das Event feuern könnte?

Ohne Code eben schwer zu beurteilen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Z
Zaziggi Themenstarter:in
12 Beiträge seit 2020
vor 4 Jahren

Ja, ich dachte mir schon, dass die Frage nach dem Code kommt.
Jedoch wüsste ich gar nicht, welches Codeschnipsel ich ausschneiden sollte, da ich es nicht eingrenzen kann. Aber ich wühl nochmal a bisserl. Ich hatte gehofft, dass dieses Verhalten bekannt ist, weil die Vorgehensweise ja jetzt nciht sehr ausgefallen ist...

lg

ZaZiggi

T
2.224 Beiträge seit 2008
vor 4 Jahren

Abhängig vom Code und wie das Verhalten der entsprechenden Controls ist, kann dies schon ein gewaltigen Unterschiedlichen.
Wenn du z.B. direkt das Event aufrufst, dies aber nicht zeigst, dann wäre der Fehler klar.
Oder wenn das Control selbst das Event feuert, weil du den Index manuell setzt, dann kann dies auch der Grund sein.
Aber ohne Code, den leider nur du kennst, kann dir niemand sagen was das Problem ist.

Auch fehlt ein kleiner Hinweis welche Technologie du verwendest.
ListBox und DatePicker gibt es für WinForms, WPF, ASP .NET und vermutlich viele weitere Varianten.
Hier muss man schon die konkrete Technik kennen, damit man z.B. auch über die Dokumentation zu dem jeweiligen Controls das Verhalten nachvollziehen kann.
Dazu werden die Controls ausgiebig von Microsoft dokumentiert und mit entsprechenden Hinweisen bei den Events oder Eigenschaften auch klar gekennzeichnet.

Dies macht die Suche nach der Ursache ebenfalls ein Stück leichter für dich und alle anderen, zusätzlich zu dem Code der das problem verursacht.
In diesem Fall muss es ja durch einen Datumswechsel, also vermutich das Date_Changed Event kommen.
Wenn noch weitere Methoden auf die ListBox zugreifen, wären diese auch hilfreich.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.842 Beiträge seit 2008
vor 4 Jahren

Ja, ich dachte mir schon, dass die Frage nach dem Code kommt.
Jedoch wüsste ich gar nicht, welches Codeschnipsel ich ausschneiden sollte

Tipp: les Dir immer Deinen eigenen Text durch und überleg Dir dann, ob ein potentieller Helfer Dir mit den Informationen helfen kann.
Hier ist das eindeutig nicht der Fall.

Wie T-Virus schon richtig sagt ist nicht mal klar, mit welcher Technologie Du arbeitest; Du hast es weder gesagt noch im entsprechenden Forenbereich gepostet - und eine Glaskugel haben wir halt auch nicht 😃

5.658 Beiträge seit 2006
vor 4 Jahren

Aber ich wühl nochmal a bisserl. Ich hatte gehofft, dass dieses Verhalten bekannt ist, weil die Vorgehensweise ja jetzt nciht sehr ausgefallen ist...

Jede Vorgehensweise, wo man vor dem Posten nach Code "wühlen" muß, ist...extrem ausgefallen.

Bitte beachte [Hinweis] Wie poste ich richtig?, besonders Punkt 5.

Und mit dem Debugger kannst du selbst durch deinen Code gehen und nachsehen, was dort passiert: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Weeks of programming can save you hours of planning

Z
Zaziggi Themenstarter:in
12 Beiträge seit 2020
vor 4 Jahren

Also ich hab den Fehler jetzt gefunden, auch wenn ich es nicht ganz verstehe.

In einer Methode, die mit einem Klick auf einem Kunden der Listbox lstBxKnd ausgelöst wird, steht lstBxCustomerInstReNr.SelectedIndex=0;

Ich hab dem eigentlich keine Bedeutung diesbezüglich beigemessen, aber wenn ich es auskommentiere, wird die selection_changed Methode beim Datumwechsel nicht mehr ausgeführt.

Ich nutze dieses Kommando in Verbindung mit lstBxCustomerInstReNr.SelectedValue.toString(), um das erste Item einer Listbox der KundenDetails auszulesen um den Inhalt in eine Config zu schreiben.+#
Wie kann ich das erste Item auslesen ohne es zuvor selektieren? Daran bin ich gescheitert.

listbox.Items[0].toString() klappt nicht.

Es handelt sich um eine wpf-listbox, falls das von bedeutung ist.

lg

Stefan

Z
Zaziggi Themenstarter:in
12 Beiträge seit 2020
vor 4 Jahren

Bitte beachte
>
, besonders Punkt 5.

Und mit dem Debugger kannst du selbst durch deinen Code gehen und nachsehen, was dort passiert:
>

Okay, ich werde mir das beim nächsten Post zu Herzen nehmen 😃

5.658 Beiträge seit 2006
vor 4 Jahren

Es handelt sich um eine wpf-listbox, falls das von bedeutung ist.

Hier gibt es Beispiele-Code und ein Beispiel-Projekt: [Artikel] MVVM und DataBinding

Weeks of programming can save you hours of planning

Z
Zaziggi Themenstarter:in
12 Beiträge seit 2020
vor 4 Jahren

Hier gehts los

 private void DatePickerInst_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            //Liest das Datum aus
            readXamlItems();

            //fragt die Kundenliste des Tages ab
            sqlQueries.writeCustomerNameTolstBxInstCustomer();

            //Schreibt die Kunden in die Listbox
            writeCustomerList();

        }

und hier passiert

private void writeCustomerDetails()
        {
            using (sqlQueries.varMySqlDataAdapterCustomerDetails)
            {
                sqlQueries.varMySqlCommandCustomerDetails.Parameters.AddWithValue("@adr_de_kndnr", lstBxInstCustomer.SelectedValue);
                DataTable KndNrTable = new DataTable();
                sqlQueries.varMySqlDataAdapterCustomerDetails.Fill(KndNrTable);

                lstBxCustomerInstKndNr.DisplayMemberPath = "KndNr";
                lstBxCustomerInstKndNr.SelectedValuePath = "KndNr";
                lstBxCustomerInstKndNr.ItemsSource = KndNrTable.DefaultView;
            
              
                    lstBxCustomerInstName.DisplayMemberPath = "Kunde";
                    lstBxCustomerInstName.SelectedValuePath = "Kunde";
                    lstBxCustomerInstName.ItemsSource = KndNrTable.DefaultView;



    
                    lstBxCustomerInstName.SelectedIndex = 0;

                    varKunde = lstBxCustomerInstName.SelectedValue.ToString();
                }
            }
            
        }
C
2.122 Beiträge seit 2010
vor 4 Jahren

In der ersten Frage ist von Problem und Fehler die Rede. Interessanterweise fragt bisher niemand was das Problem bzw. der Fehler ist.

Die Ursache ist, dass die Liste bei Änderungen Events auslöst. Das soll sie auch. Wenn daraufhin etwas ungewolltes passiert, ist das Problem in diesem Eventhandler zu suchen.
Was mir spontan einfällt ist dass die Liste zuerst geleert und dann wieder gefüllt wird, was ZWEI Events erzeugen kann. Oder dass der Eventhandler nicht mit einer leeren Liste zurecht kommt.

Im gezeigten Code wird der SelectedIndex auf das erste Element gesetzt. Wenn es kein solches gibt, gibts eine Exception. Genauso würde SelectedValue.ToString() eine erzeugen, wenn SelectedValue NULL ist.

T
2.224 Beiträge seit 2008
vor 4 Jahren

Und dein Code zum Zugriff auf die Datenbank gehört nicht in die UI.
Sowas sollte sauber mit dem Drei Schichten Modell wegegekapselt werden.
Ebenfalls scheint dein Code auch nicht ganz sauber zu sein.
Du hast scheinbar in sqlQueries einige Dinge gemischt verpackt, wie den DataAdapter und ein Command.

Hier scheinst du dann auch direkt Properties zu disposen, wenn es den Properties sind.
Sowas sollte man generell wegkapseln, sonst baust du dir schnell eine weitere Fehlerquelle ein.
Außerdem gibst du damit die interna der Klasse preis.
Hier solltest du drigend aufräumen um weitere Fehlerquellen in zukunft auszuschließen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Z
Zaziggi Themenstarter:in
12 Beiträge seit 2020
vor 4 Jahren

Erstmal danke für eure Antworten.

Ich hab mich nun dazu entschlossen, den Code komplett neu aufzusetzen, les mich vorher aber nochmal ordentlich ein.

Schöne Grüße

Ste

16.842 Beiträge seit 2008
vor 4 Jahren

In der ersten Frage ist von Problem und Fehler die Rede. Interessanterweise fragt bisher niemand was das Problem bzw. der Fehler ist.

... wozu man auch erstmal wissen muss welche Technologie überhaupt eingesetzt wird 😃

5.658 Beiträge seit 2006
vor 4 Jahren

Ich hab mich nun dazu entschlossen, den Code komplett neu aufzusetzen, les mich vorher aber nochmal ordentlich ein.

Klingt vernünftig.

Da du mit WPF arbeitest, empfehle ich einen Blick in [Artikel] MVVM und DataBinding

Für allgemeine Infos zu Code-Strukturierung bzw. Software-Architektur gibt es den Artikel zur [Artikel] Drei-Schichten-Architektur

Auch der Umgang mit dem Debugger erleichtert die Entwicklung sehr: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Und für das Arbeiten mit Datenbanken empfehle ich die Verwendung von ORM wie z.B. den Entity Framework.

Weeks of programming can save you hours of planning