Announcement

Collapse
No announcement yet.

Kein CellValueChanged event vom DataGridView

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kein CellValueChanged event vom DataGridView

    Hallo,

    ich habe mir eine einfache Windows Forms Anwendung erstellt, die nur aus einem DataGridView besteht. Dieses DataGridView hat keine DataSource. Ich habe einfach im Visual Studio Designer drei Text Columns hinzugefügt.
    Im Quellcode habe ich mich an dem event CellValueChanged des DataGridViews angemeldet. Dieses Event wird auch immer gefeuert, wenn ich einen Wert in einer Zelle ändere. Es wird aber NICHT gefeuert, wenn ich einen Wert ändere und dann direkt auf den Column Header klicke um zu sortieren.
    Weiß jemand warum das so ist und was man da machen kann?

    Ich verwende übrigens .NET 2.0 mit VS 2008.

    Viele Grüße
    Chris

  • #2
    Der Zellenwert wird übernommen(und damit der Event gefeuert) wenn die Zelle den Focus verliert. Wenn du auf den Header klickst um zu sortieren behält die Zelle ihren Fokus. Wenn du die Spalte sortierst in der du gerade editierst wird ja dieser Wert auch nicht bei der Sortierung berücksichtigt da er ja noch nicht übernommen worden sondern weiterhin in Bearbeitung ist. Im Moment halte ich das Verhalten nicht nur für erklärbar sondern auch für richtig.

    Warum willst du denn das der Event feuert (ohne das sich der Zelleninhalt bisher geändert hat)?

    Wenn du die Bearbeitung unter diesen Umständen abbrechen oder commiten willst dann musst du z.b. in RowHeaderMouseClick CancelEdit bzw. CommitEdit aufrufen. Beim Commiten sollte dann auch der besagte Event gefeuert werden.

    Comment


    • #3
      CellValueChanged wird nur gefeuert, wenn der Focus auf ein anderes Objekt wechselt (daher reagiert dieser event auch nicht, wenn man die Daten zB. per Programm ändert). Anscheinend dürfte der Header nicht fokusierbar sein, daher bleibt der Focus weiterhin auf der Datenzelle und es gibt keinen Event. Wie man das jetzt am besten abfängt kann ich dir auf die Schnelle leider nicht sagen (bin mehr der Delphi-Typ ).

      bye,
      Helmut

      edit:
      hab gerade gesehen, ich war zu langsam ...
      Aber zu Ralf's Antwort: ich nehme an, wenn man auf den Header klickt um die Spalte zu sortieren, dann will man sicher auch damit automatisch vorher die Eingabe beenden. Wäre zumindest für mich ein logisches Verhalten und eher verständlich als der aktuelle Zustand, der nur deswegen passiert, weil anscheinend der Header nicht den Fokus erhalten kann.

      Comment


      • #4
        Erst mal danke für Eure Hilfe!
        Der Wert wird übernommen wenn ich auf den Header klicke. Und es wird anschließend auch sortiert. Nur das Event kommt eben nicht.
        Das die Zelle den Fokus behält kann ich bestätigen. Aber der neue Wert wird bei der Sortierung berücksichtigt.
        Das fehlende Event könnte ein Bug sein. Gestern habe ich noch das hier gefunden.

        Ich habe hier eine ziemlich komplizierte Client/Server Anwendung. Immer wenn der Client einen Wert ändert, wird dieser an den Server gesendet.

        Comment


        • #5
          Aber reicht dort nicht auch EndEdit oder sowas? Ich meine jede Änderung an den Server zu schicken macht eigentlich nur wirklich für Suggestions Sinn. Was ist denn der Usecase?

          Comment


          • #6
            EndEdit kommt aber leider auch wenn sich der Wert gar nicht geändert hat. Das muss man dann selber prüfen. So ähnlich wie in dem Link. Der castet aber alles auf string. Das ist nicht gut.

            Der Client benachrichtigt den Server und der Server benachrichigt dann wieder ein anderes Modul des Clients.

            Comment


            • #7
              Den Bug würde ich im Moment bestätigen. Je nach ~Mode~ des Grids (gebunden ungebunden, gebunden an DataTable, gebunden an List<T>) verhält sich das Grid da anders. Ob dein beobachtetes Verhalten konkret als Bug einzustufen ist bin ich mir nicht sicher in Summe aber auf jeden Fall. Das Eventverhalten sollte egal wie man die Daten ins Grid bekommen hat gleich sein.

              Ich würde wohl ein kleines Datenmodell schreiben und auf Databinding umstellen. Das hat man üblicherweise wesentlich besser im Griff als sich mit den Events und deren Aufrufreihenfolge rumzuschlagen. Mal abgesehen von dem Vorteil UI und Anwendungslogik voneinander zu trennen. Einziger Wermutstropfen, je nachdem wie du dieses Datenmodell schreibst, müsstest du das sortieren dort selbst implementieren.

              Comment


              • #8
                Kann man denn das GridView so einstellen, dass Änderungen innerhalb einer Zelle sofort an das gebundene Object weitergeleitet werden? Wenn nicht hilft das chris23 wohl nicht viel.

                Comment


                • #9
                  Kann man denn das GridView so einstellen, dass Änderungen innerhalb einer Zelle sofort an das gebundene Object weitergeleitet werden? Wenn nicht hilft das chris23 wohl nicht viel.
                  Da der Wert beim sortieren berücksichtigt wurde ist das hier bereits eindeutig der Fall.

                  Comment


                  • #10
                    Und das lässt sich auch einfach testen indem man nen Breakpoint in die gebundene Property setzt und schaut wann der Wert dort einschlägt.
                    Ich finde diesen Weg generell besser. UI Events sollten immer nur der absolut letzte Weg sein.

                    Comment

                    Working...
                    X