Announcement

Collapse
No announcement yet.

UserControl mit DataGridView verbinden

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

  • UserControl mit DataGridView verbinden

    Hallo zusammen,

    ich habe ein Verständnisproblem bei der Verbindung einer DataGridView mit einem UserControl:

    In einem WinForm gibt es ein DataGridView, welches Daten einer DataSource anzeigt.
    Unter dem Grid habe ich ein UserControl eingebaut, welches zu dem jeweils im Grid gewählten Datensatz Detailinfos anzeigen soll, welche in dem Grid selbst keinen Platz haben.
    Das habe ich sogar hinbekommen.

    Aber ich möchte darüber hinaus in dem UserControl abhängig von bestimmten Feldinhalten von Statusfeldern bestimmte Label ein-/ausblenden, bzw. Texte verändern.
    Dazu habe ich keine Lösung gefunden. Es gelingt mir nicht, im Source des UserControls auf den Datensatz zuzugreifen. Auch finde ich dort kein Ereignis, welches beim simplen blättern im Grid ausgelöst wird.


    So habe ich das bisher gelöst:

    //im UserControl wird die DataSource source verbunden:
    Code:
    tbxNachname.DataBindings.Clear();
    tbxNachname.DataBindings.Add("EditValue", source, "NACHNAME");
    aber wo kann ich den wechsel des Datensatzes im UserControl mitbekommen und Labels verändern?
    Ich habe z. B. ein Feld "STATUS" im Datensatz, von dem abhängig ich u. A. in einem Label den Text "PRIVAT" erscheinen lassen möchte. Dieser Text steht aber nicht in dem Feld. Ich kann also hier nicht einfach das Feld mit dem Label verbinden.

    Ciao,
    N

  • #2
    Originally posted by nextX View Post
    ..aber wo kann ich den wechsel des Datensatzes im UserControl mitbekommen..

    OnSelectionChanged

    Günther

    Comment


    • #3
      Originally posted by Günther Weber View Post
      ja, das kenne ich. Das ist aber ein Ereignis des Grids.
      Ich suche jedoch eine Möglichkeit die Änderung des Datensatzes in dem UserControl mitzubekommen.
      Das UC ist ein Panel mit einigen Label- und Edit-Controls. Über die Bindings werden die Werte des jeweils selektierten Datensatzes schon richtig angezeigt. Sogar editieren funktioniert einwandfrei.

      Nur möchte ich im Source des UserControls auf Veränderungen des Datensatzes reagieren. Einfach um möglichst viel Funktionalität im UserControl zu kapseln, um das dann wiederum an unterschiedlichen Stellen im Programm einfach einklinken zu können.

      Im Grid Ereignisse zu hinterlegen, die dann das UserControl ansprechen, ist für mich zunächst mal nur eine Lösung der 2. Wahl.
      Aber wenn es nicht eleganter geht...

      Comment


      • #4
        Kann der Datensatz in der DataSource nicht einfach INotifyPropertyChanged implementieren? Dieses wird gefeuert sobald sich irgendwas an den Daten ändert. Dann werden die Daten eigentlich automatisch an die UI weitergegeben. Damit generell die Benachrichtigung besser funktioniert würde ich die Daten in eine BindingList packen. Diese unterstützt auf jeden bidirektionales DataBinding wenn die Daten INotifyPropertyChanged implementieren.
        Wenn in der Ansicht noch sehr viel Logik passiert würde ich vielleicht noch ein ViewModel zwischen die Daten und das Control bauen was dann für rein Anzeigelogik verantwortlich ist.

        Comment


        • #5
          Ich suche jedoch eine Möglichkeit die Änderung des Datensatzes in dem UserControl mitzubekommen.
          Im Grid Ereignisse zu hinterlegen, die dann das UserControl ansprechen, ist für mich zunächst mal nur eine Lösung der 2. Wahl.
          Dein versuchter Weg ist meiner Meinung nach eine schlechte Verteilung der Kompetenzen. Das UserControl ist sozusagen das KindControl der Form oder eines anderen Controls auf dem es liegt. Das sich das Usercontrol Interna aus dem Vatercontrol holt um darauf zu reagieren finde ich verdreht. In komplexen Strukturen führen solche wechselseitigen Verknüpfungen (Vatercontrol -> Kindcontrol und umgekehrt) regelmäßig zu schwer beherschbaren Problemen.

          Wenn dein UserControl ein Anzeige/Editiermöglichkeit für genau einen Datensatz sollte es auch nur genau diese Kenntnis haben. Also lieber einfach im Vatercontrol auf ein Datensatzwechsel reagieren und diesen einzelnen Datensatz dann ins UserControl schrieben.

          Einfach um möglichst viel Funktionalität im UserControl zu kapseln, um das dann wiederum an unterschiedlichen Stellen im Programm einfach einklinken zu können.
          Dir sollte klar sein das um so mehr du da rein packst um so geringer wird die Wahrscheinlichkeit es sinnvoll wiederverwenden können. Insbesondere wenn die entsprechende Logik im Usercontrol von Annahmen über seinen Benutzer ausgeht.

          Wenn in der Ansicht noch sehr viel Logik passiert würde ich vielleicht noch ein ViewModel zwischen die Daten und das Control bauen was dann für rein Anzeigelogik verantwortlich ist.
          Ein intelligenteres Model wäre der nächste logische Schritt um wechselseitigen Beziehungen aus dem Weg zu gehen. BindingListen werden da leider nicht ganz ausreichen wir brauchen ja auch die Information einen aktuellen Datensatzes.

          Comment


          • #6
            danke für eure Anregungen!

            INotifyPropertyChanged
            Das ist mir etwas zu kompliziert, bzw. habe ich noch nicht so recht verstanden. Mit solchen Dingen habe ich noch nie zu tun gehabt.

            wechselseitigen Beziehungen aus dem Weg zu gehen. BindingListen werden da leider nicht ganz ausreichen wir brauchen ja auch die Information einen aktuellen Datensatzes.
            Vermutlich habe ich mich nicht so klar ausgedrückt:

            Das UserControl soll genau einen Datensatz hübsch aufbereitet und in einigen Feldern auch editierbar darstellen.
            Durch die Databindings klappt das aktuell auch schon für fast alle Felder. Die Datasource des UserControl wird vom Hauptformular beim erstellen mit der Datasource des Grid verbunden.
            Nur für einige Felder reicht mir nicht die Darstellung des Feldinhaltes in einem Editfeld, sondern ich muß irgendwelche Schlüssel auswerten und dann in Lablen für die Benutzer lesbare Klartexte ausgeben.

            Nun suche ich eine Möglichkeit, in dem UserControl mitzubekommen, wann diese Schlüssel ausgewertet und die Lables aktualisiert werden müssen.

            Meine aktuell preferierte Lösung (noch nicht umgesetzt, keine Gelegenheit) sieht so aus, dass ich in einem OnSelectionChanged des Grid eine Aktualisierungsfunktion des UserControl aufrufen werde.

            Ursprünglich hatte ich gedacht, das UserControl kannselbst erkennen, wenn sich der aktuelle Datensatz in der übergebenen DataSource verändert (irgendein Ereignis der DataSource?). Aber das ist wohl zuviel Automatismus....

            Ciao,
            N.

            Comment


            • #7
              Originally posted by nextX View Post
              danke für eure Anregungen!



              Das ist mir etwas zu kompliziert, bzw. habe ich noch nicht so recht verstanden. Mit solchen Dingen habe ich noch nie zu tun gehabt.



              ...
              Da solltest Du Dich aber unbedingt damit beschäftigen, weil das eben der .NET Weg ist genau das zu tun was Du willst. Dazu kommt noch dass das in jeder anderen Programmiersprache eigentlich genauso funktioniert (Stichwort: Observer Pattern).
              In Current sollte eigentlich immer das aktuelle ausgewählte Element stehen. Welchen SelectionMode hast Du im Grid? Stell mal auf FullRowSelect um. Dann kann man nur eine ganze Zeile auswählen (das ist ja das was Du willst) und dann sollte auch die Current Property in der DataSource funktionieren.

              Comment


              • #8
                Originally posted by fanderlf View Post
                Da solltest Du Dich aber unbedingt damit beschäftigen
                Das stimmt natürlich schon....

                Dennoch konnte ich in diesem konkreten Fall mein Problem auf die Schnelle mit der Nutzung des OnSelectionChanged-Ereignisses erschlagen. Hier übergebe ich einfach den Datensatz aus der aktuellen Zeile des Grids (das Grid selbst ist ReadOnly) heraus an das Userform und schon habe ich alle Informationen, die ich hier brauche.

                Die vorgeschlagene Alternative mag eleganter sein, hätte in meinem konkreten Fall doch einiges an Umbauten in dem schon vorhandenen Programm erfordert. Das geht aktuell aber nicht.

                Trotzdem vielen Dank für die Anregungen und Hinweise. Mit Googles Hilfe habe ich nun wieder einige Einstiegspunkte zu noch zu lernendem...

                Ciao,
                N.

                Comment

                Working...
                X