C# ListBox Event nicht vorhanden?

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Ich will überprüfen ob ein Element in die Liste hinzugefügt oder entfernt worden ist. Finde irgendwie im Editor keinen passenden Eventhandler dazu... gibt es eine Alternative wie man überprüfen kann ob der Listeneintrag sich geädert hat?
 
Geändert per hand (user) oder zb von einer Methode?

Ich arbeite meistens mit SelectedIndexChanged.
 
Zuletzt bearbeitet:
Schon mal das TextChanged-Event probiert?

@BlackLine: Was hat "SelectedIndexChanged" mit dem Hinzufügen oder Entfernen von Elementen zu tun?
 
Zuletzt bearbeitet:
Meistens wird der Index zurückgesetzt, bzw neu gesetzt, dann wird diese methode sogar mehrmals aufgerufen. mfg
 
Meistens? oO
Wenn am Ende ein Item hinzugefügt wird ändert sich daran gar nix. Warum denn auch? Wenn nichts selektiert ist, ändert sich gar nichts... Bringt also gar nichts.

Genauso wie mein TextChanged-Event, welches es in meinem VS2008 nicht zum Auswählen gibt...


Edit:
Das lässt sich aber doch eigentlich auch ohne Event machen, notfalls macht man halt selbst über nen Delegate nen speziellen Event-Handler dafür, wenn man selbst Dinge aus der ListBox hinzufügt oder entfernt. Schließlich sind die meisten Events ja eher Reaktionen auf Dinge von Außen, z.B. System, andere Programme, Benutzer. Aber von Außen werden nie neue Einträge kommen oder Einträge entfernt. Also überall, wo man halt dann listBox.Items.Add() und .Remove() nutzt, ruft man halt die gewünschte Methode (notfalls wie gesagt über Delegate) auf.

Edit2: @ThreadErsteller: Und Listeneintrag geändert ist was ganz anderes als "Einträge hinzugefügt" oder "Einträge entfernt".

Und wer hat eigentlich gesagt, dass es sich um eine ListBox handelt? Wäre auch nicht falsch einfach mal die verwendete Klasse zu nennen... Edit: Steht ja im Titel :-)
 
Zuletzt bearbeitet:
Öffentliche Methoden gibt es dafür nicht, da müsstest du wohl die internen für überschreiben. (ähnlich wenn man die Textfarben etc. ändern möchte.)
 
es ist listbox....
ups sorry, ich meinte ja dass die länge der Liste sich geändert hat... nicht der eintrag selbst!

Es ist so, dass jeder eintrag automatisch in die DB übernohmen werden sollte. Ich wollte keine schleife verwenden. Naja aber wenn es nicht geht, werde ich einfach alle Elemente über die schleife reinquetschen.

Danke für die Antwort!
 
Auf irgend eine weise fügst du den Eintrag doch der Listbox hinzu, dann kannst du gleichzeitig das Ding in deiner DB speichern.
 
ich übernehme von eine vordefinierte liste die gesamteinträge. hmm läuft eigentlich addrange über eine schleife? wenn ja, dann kann ich genauso gut die neue Liste füllen und in die DB schreiben, aber nicht mit addrange
 
Kannst ja von ListBox erben, die ganzen Add- und Remove-Methoden überschreiben, die base-Methoden ausführen und dann die Items, die du ja über die Parameter bekommst, in die DB eintragen lassen. Oder du gehst hin und rufst an diesen Stellen ein Event auf.
Dann hast du halt deine eigene ListBox-Modifikation, die das alles automatisch macht.
 
Das ist völlig daneben. Wir brechen hier doch nicht eine Datenstruktur auf um da irgendwelche Methoden zu überschreiben nur um unsere Funktionaliät da reinzuquetschen.
Man sollte sich schon an das PRinzip der Kapselung halten.


@roker002: Was heißt bei dir "vordefiniert"?. Wenn du die Listbox an die Datenbank binden willst, dann nutze hier lieber BindingSources, die bindest du an die DB und dann arbeitest du über die Methode der Bindingsource(EndEdit(),AddNew usw...) und fügst somit die Daten in die Datenbank ein.
Aber hier die Listbox neu erfinden um die Add- und Remove Methoden anzupassen ist am Design vorbei gedacht.
 
Zuletzt bearbeitet von einem Moderator: (Überflüssiges Komplettzitat entfernt.)
neee es geht garnicht um bindings.... das wäre auch gar kein Problem. Ich bastele gerade an eine "Vorlage" funktionen, die alle Änderungen in die Datenbank überträgt. Deswegen bringt es nur wenig was an den bindings zu halten wenn es dazu kein eventhandler unterstützt wird.

Mir geht es generell jetzt die Software so schnell wie möglich zu erstellen, sonst habe ich später keine Zeit :P An den ganzen kann ich noch später optimierungen machen.

Aber danke für den Tipp!

Ich habe das "Problem" glaube ich im griff! Ich werde sicher noch in der Optimierungsarbeit auf das Thema zurückkommen :D
 
Also ich denke, dass Controlling (hier die Datenspeicherung in der Datenbank) sollte von Anfang an gut da stehen, da baut auch die Datenlogik später drauf auf. Siehe MVC.

Aber da ich nicht genau weiß was du wie bewerkstelligst ist es auch etwas schwer dazu etwas zu sagen. Von daher, kann ich auch daneben liegen mit meiner Aussage, aber aus meiner Erfahrung ist das schon immer fast die halbe Miete.
 
toeffi schrieb:
Das ist völlig daneben. Wir brechen hier doch nicht eine Datenstruktur auf um da irgendwelche Methoden zu überschreiben nur um unsere Funktionaliät da reinzuquetschen.
anders funktioniert es aber nicht und das ist der einzig mögliche weg. google liefert keine anderen möglichkeiten als eben die des erbens und hinzufügens.
 
claW. schrieb:
anders funktioniert es aber nicht und das ist der einzig mögliche weg. google liefert keine anderen möglichkeiten als eben die des erbens und hinzufügens.

Das ist Unfug.

Du fügst deinem PRojekt die Dll WindowsBase hinzu, holst dir die beiden Namespaces mit rein
using System.Collections.ObjectModel;
using System.Collections.Specialized;

Somit kannst du danach die ObservableCollection<T> benutzen, diese Collection hinterlegst du bei der Listbox als Datenquellen

Listbox.DataSource = eineObservableCollection;

Als nächstes hängt man sich wie folgt an das CollectionChanged Event ran:

Code:
 ObservableCollection<int> test = new ObservableCollection<int>();

            test.CollectionChanged += (sender, eventArgs) =>
                                    {
                                        if(eventArgs.Action == NotifyCollectionChangedAction.Add)
                                            Console.WriteLine("ItemAdded");
                                    };
Bei mir ist es testhalber eine Int-Collection die vorgehensweiße ist die selbe. Somit kann man ohne Probleme auf ein ItemAdded event reagieren.
Hoffe das klar ist, das man dann nicht die Items in die Listbox sondern in die Liste einfügt. Da die ja als Datenquelle gebunden ist, aktuallisiert sie auch die Inhalte des Listbox.
;)
 
Zurück
Oben