BindingSource.CurrentItemChanged wird nicht ausgelöst

  • C#
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    BindingSource.CurrentItemChanged wird nicht ausgelöst

    Hallo,

    ich arbeite gerade an einem etwas komplexeren Datenmodell. DataGridViews und weitere Controls sind bereits fertig und korrekt über Bindingsources miteinander und an ein DataSet verknüpft, es funktioniert soweit alles so, wie es soll. Jedoch muss ich die Daten jetzt auch grafisch darstellen, und zwar so komplex, das fertige Controls nicht ausreichen. Ich hab mir also ein eigenes Control geschrieben und reagiere dort auf Änderungen im Datenmodell über die CurrentChanged- und CurrentItemChanged-Ereignisse der BindingSource.
    CurrentChanged funktioniert auch einwandfrei, klicke ich mich im DataGridView durch die Spalten durch, dann wird auch die Darstellung so aktualisiert, wie erwartet. Beim CurrentItemChanged gibt es jedoch Probleme. Die Sache ist die, dass einige Spalten der DataTable nicht im DataGridView angezeigt werden, sondern in einzelnen NumericUpDowns (also DetailView, so hat das ErfinderDesRades glaube ich in seinen vier Views genannt), genauer gesagt alle bis auf die Name-Spalte (das DataGridView wird praktisch als bessere ListBox verwendet). Wenn ich nun einige Werte mit diesen NumericUpDowns ändere, dann wird in der BindingSource das CurrentItemChanged-Event nicht ausgelöst. Das bedeutet für meine Darstellung, dass diese erste aktualisiert wird, wenn ich im DataGridView zunächst eine andere Zeile auswähle und dann wieder die geänderte Zeile auswähle. Es wird zwar alles korrekt ins DataSet eingetragen, ich hätte es aber gerne so, dass dies bereits geschieht, während man die Werte in den NumericUpDaowns ändern, nicht erst, wenn man eine andere Zeile im DataGridView auswählt, sodass sich die Darstellung sofort aktualisiert. Gibts da irgendwas?
    Sry wenn ich's falsch verstanden habe...

    du willst dass das CurrentItemChange-event auslöst, wenn NumUpDown gedrückt wird?

    du könntest dann doch eig auch das Keypress-event abfangen und (daraufhin) das CurrentItemChange-event auslösen oder nicht? ;/
    versuche es einmal mit dem NumericUpAndDown.ValueChanged-Ereignis und gib dort der Bindingsource ein .EndEdit mit...

    Visual Basic-Quellcode

    1. Private Sub NUD_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DeinNUD.ValueChanged
    2. DeineBindingSource.EndEdit()
    3. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Es funktioniert leider doch nur so halb. :/
    Wenn ich ein bisschen im DataGridView hin und her switche, dann erhalte ich jetzt einen sehr komischen Fehler:

    Als Fehlerstelle markiert mir Visual Studio die Application.Run()-Methode in Main().
    Schuld ist definitiv das BindingSource.EndEdit(), nehme ich das nämlich aus dem Event raus, kommt der Fehler nicht mehr, egal wie wild ich rumklicke (mit dem Code entsteht der Fehler relativ einfach, ein Irrtum ist ausgeschlossen).
    Ich vermute, dass es damit zusammenhängt, dass das ValueChanged-Ereignis auch ausgelöst wird, wenn man im DataGridView die Zeile ändert (weil dann werden ja die neuen Werte in die Numericupdowns reingeladen), und dann auch EndEdit aufgerufen wird, obwohl sich ja gar nichts geändert hat. Ich hab schon versucht rumzutricksen, sodass EndEdit nicht aufgerufen wird, wenn ValueChanged durch das Auswählen einer anderen Zeile ausgelöst wird, war jedoch alles ohne Erfolg bisher. Hat da noch jemand ne Idee?
    Ich bin nicht sicher, aber kann es sein, das zuvor ein Form.Validate oder Control.Validate abgesetzt werden muss?
    Schau Dir mal den Code an der für Save beim ungeliebten Binding-Navigator generiert wird:

    VB.NET-Quellcode

    1. Me.Validate()
    2. Me.Bindingsource.EndEdit()

    Wie gesagt, nur Vermutung ...
    @VB1963
    Die Exception stammt, wie man am StackTrace erkennen kann, nicht aus meinem Code, sondern aus dem MouseDown-Code des DataGridViews, da kann ich schwer irgend was ändern.

    @us4711
    Hat, soweit ich das sehe, nichts geändert.

    @ErfinderDesRades
    Du meinst wahrscheinlich die Zeile im Designer-Code, richtig? Ich hab das mal da eingetragen und es tut sich nichts.
    Liegt das vielleicht daran, dass das NumericUpDown kein INotifyPropertyChanged implementiert? Wenn ja könnte ich das ja über Vererbung relativ einfach lösen.


    Edit: ok, ich habs geschafft. War etwas Rumgefrickel notwendig, aber mit diesen Event-Codes funktioniert es nun:

    C#-Quellcode

    1. private void NumericUpDownValidatedHandler(object sender, EventArgs e)
    2. {
    3. roomsBindingSource.EndEdit();
    4. }
    5. private void NumericUpDownValueChangedHandler(object sender, EventArgs e)
    6. {
    7. if (((NumericUpDown)sender).Focused) this.Validate();
    8. }

    Danke an alle, die mir geholfen haben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    Artentus schrieb:

    Du meinst wahrscheinlich die Zeile im Designer-Code, richtig?
    naja - man kann das auch tatsächlich im Designer einstellen, unter erweiterte Einstellungen des Bindings.

    Ansonsten Glückwunsch zur Problemlösung! :thumbsup:
    Iwie kommt Databinding als Wissenschaft da bisserl an die Grenze, wenn man da so mit Try&Fail rumfrickeln muss, bis man raushat, wie genau den Bindings in den Hintern treten, dass sie spuren, wie sie sollen.

    ErfinderDesRades schrieb:

    man kann das auch tatsächlich im Designer einstellen
    Hab ich nicht gefunden, ich bin da aber auch noch nicht sooo fit (wobeis ja wirklich ziemlich einfach ist, vor allem mit deinen tollen Tutorials, die sind echt klasse).

    Ich glaube ja, meine Lösung ist nur ein Workaround, aber solange die Usability verbessert wird solls mir recht sein.