DatagridView Textbox

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von BigBen2003.

    DatagridView Textbox

    Hallo,
    in einem DataGridview können nach der msdn-Webseite auch eigene Controls angebunden werden:

    msdn.microsoft.com/de-de/library/y0wfd4yz(v=vs.110).aspx

    Für mein Projekt müssen Angaben vor der Anzeige in einer Textbox erst "bearbeitet" werden, um anschließend angezeigt zu werden. Sobald der Anwender diese Angaben verändert, müssen diese wieder vor dem Übernehmen ins Dataset "bearbeitet" werden.

    bislang wurde es so gelöst, dass eine Textbox Namens "Key" außerhalb der DatagridView platziert wurde, die nur mit Databinding an den aktuellen Datensatz der DataGridview angebunden wurde. Sobald im DataGridview der Datensatz gewesechselt wure, wird auch die Angabe in der separten Textbox "Key" geändert. In einer zweiten seperaten Textbox "KeyView" wird der "bearbeitete" Inhalt der "Key"-Textbox angezeigt. Der Anwender kann den Inhalt in der "KeyView"-Textbox bearbeiten. Bei einer Änderung wird der Inhalt über eine Funktion "bearbeitet" und das Ergebnis in die "Key"-Textbox geschrieben.

    Die Textbox "Key" hat nur die Funktion, dass die Inhalte mit dem Datenquelle verbunden werden können. Diese ist für den Anwender unsichtbar.

    Es wäre für den Anwender leichter, wenn die seperate "KeyView" Textbox in die DataGridView als Spalte mit integriert werden kann.

    Daher nun meine Frage: Ist das möglich?

    Eine mögliche theoretischer Lösungsansatz wäre im DatagridView eine Spalte "Key" unsichtbar einzubinden, und eine zweite Spalte ungebunden mit dem Namen "KeyView" im DataGridView aufzunehmen. Programmatisch müsste dann eine Verbindung von der Spalte "Key" zum "KeyView" hergestellt werden.

    En anderer theoretischer Lösungsansatz wäre das Datagridview an eine Klasse zu binden, in der alle Spalten inkl. KeyView bereitgestellt werden.
    Die Daten der anderen Spalten 'werden nr 1:1 durchgereicht, während die von "Key" erst in der Klasse "Bearbeitet" und das Ergebnis anschließend an das DataGridView gereicht wird. Beim Aktualisieren der Spalte "Key" alias "KeyView" müssen die Inhalte ebenfalls vor dem weiterreichen an die Datenquelle "bearbeitet" werden.

    Der letztere Lösungsansatz scheint mir am sinnvollsten, da hierbei auf Standard-DatagridView Controls zurückgegriffen werden kann. Hierbei wird auch "nur" eine Textbox pro Datensatz benötigt; bei der anderen werden hingegen zwei Textboxen benötigt:"Key" (unsichtbar) und "KeyView"

    Ich habe bislang leider keine Erfahrungen mit Klassen, die als DataSource herangezogen werden können.
    Auch mit der Erstellung von eigenen Controls habe ich bis dato keine Erfahrungen machen können.

    Hat jemand schon mal ein ähnliches Projekt umgesetzt, oder hat jemand Webseite(n), auf denen das Thema sogar mit Beispielen veranschaulicht wird?
    ich hab das noch nicht verstanden mit den Textboxen, die nicht sichtbar sind, und Textboxen, die den Wert anzeigen, wie er war, bevor er geändert wurde, und wie das funzzen soll, und was der Sinn.
    jdfs. prinzipiell kann man dem DGV auch ungebundene TextboxSpalten zufügen, und mit dene kannste natürlich machen was wolle.

    Ich rate davon ab, DGV oder typDataset zu beerben oder durch eigenes Klassengedöhns ersetzen zu wollen.
    Hallo EdR und Ananel,

    ich habe ich mir schon fast gedacht, dass davon abgeraten wird eine eigene Klasse als Dataset zu erstellen.

    Hintergrund ist folgender:

    Im Anhang ( dropbox.com/s/ghurhaxhuofkovu/…en_update_values.png?dl=0 ) ist en Ausschmitt von einem UserForm zu sehen.

    Sobald in der Tabelle ein Datensatz gewechselt wird, werden auch die weiteren Textfelder "Benutzername" Passwort, Key, "Verschlüsseltes Passwort" und die Optionsfelder aktualisiert.

    Eine Direkte Verbindung zum Databinding haben nur zwei Textfelder: "Benutzername, und "Verschlüsseltes Passwort". Diese Angaben werden Automatisch aktualisiert, nachdem in der Tabelle ein Datensatz gewechselt wird.

    Die weiteren Textfelder "Passwort", "Key" und die OPtionsfelder werden indirekt durch das Event Textchanged der Textbox "Verschlüsseltes Passwort" gesetzt.

    Wenn die Textbox "Verschlüseltes Passwort" ausgeblendet wird, wird auch kein Event TextChanged mehr ausgeblöst. Daher werden auch die Optionsfelder nicht mehr richtig gesetzt.

    Gibt es denn kein Event, das vom DataGridView ausgelöst wird, sobald der aktuelle Datensatz gewechselt wird?

    Nachtrag:
    ========
    Habe das gesuchte Event gefunden: Es musste das Event RowEnter vom DataGridView abgefangen werden.

    Somit haben sich die ganzen Überlegungen mit einer eigenen Dataset-Klasse erübrigt.

    Vielen Dank für die Anregungen und sorry für meine doch recht umständlichen Fomulierungen.

    Was mir noch aufgefallen ist:

    Wenn die TextBox beim Öffnen der Userform sichtbar war und anschließend erst ausgeblendet wird, werden die Events "TextChanged" unabhängig von der Sichtbarkeit immer ausgelöst.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BigBen2003“ ()

    ErfinderDesRades schrieb:


    Ich rate davon ab, DGV oder typDataset zu beerben oder durch eigenes Klassengedöhns ersetzen zu wollen.


    Es ist durchaus sinnvoll, zuerst zu gucken, ob man mit einem einfach DGV auskommt, aber es gibt durchaus Anwendungsfälle, die nicht abgedeckt werden.

    Beispielsweise, wenn sich noch während der Eingabe, die Zeilenhöhe anpassen soll, oder wenn man nur in manchen Zellen einer Spalte einen Button haben möchte.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    naja - mw - aber ich seh Controls selbst erfinden als das letzte Mittel, wenn man mit anneren Strategien nicht mehr weiter kommt.
    Und grad bei DGV bin ich immer mit einer Behavior-Strategie durchgekommen, also eine Klasse, die mit eim Dgv initialisiert wird, und alle mögliche Tricks per EventHandling ausführt.

    Selbstgebastelte Controls - insbesondere, wennde Zusatz-Properties dranmachst - haben auch immer ein eigenes Verhalten im Form-Designer, und das ist nur für den vorhersehbar, der sich mit auskennt.

    Ansonsten geb ich dir recht: Es kann Fälle geben, wo beerben tatsächlich die bessere Option ist.
    Hallo,

    habe es inzwischen eingesehen, dass es mit eigenen Controls nicht einfacher wird.

    Mit Standard-Controlsist z.B. folgende simple Maske vorhanden:



    Der Anwender muss zuerst im DataGridvew die Angaben ausfüllen und anschließend das separate Passwort-Feld.
    Wenn innerhalb des Datagridviews eine Angabe in einem der Felder verändert wird, wird der Pfeil-nach-Rechts als Stift angezeigt.
    Erst nach der Übernahme der neuen Angabe wird der Stift wieder als Pfeil-nach-Rechts angezeigt.

    Wenn der Anwender Im Passwort (seperate Textbox) eine Angabe ändert, wird diese verschlüsselt, und im unterem Feld (txtWindowsPasswordDecrypt) übernommen. Dieses Feld ist normalerweise nicht sichtbar. Diese Angabe ist mit dem Passwort-Feld im DataGridview verbunden.

    Im seperaten Passwort-Textbox wird die Methode "Textchanged" abgefangen, um den neuen Text zu verschlüsseln und in das untere Feld zu schreiben:

    VB.NET-Quellcode

    1. Private Sub txtWindowsPassword_TextChanged(sender As Object, e As EventArgs) Handles txtWindowsPassword.TextChanged
    2. Me.txtWindowsPasswordDecrypt.Text = TripleDES.EncryptText(Me.txtWindowsPassword.Text)
    3. End Sub


    Die neue Angabe wird allerdings erst nach einem Wechsel des Datensatzes im DataGridview übernommen.

    Wenn der Anwender nur die Passwort-Angabe ändert und anschließend das Formular schließt, wird die Angabe gar nicht übernommen. Auch wenn beim Schließen immer alle Daten im Dataset gespeichert werden, wäre die Passwort-Änderung nicht mit dabei. Erst durch einen expliziten Datensatzwechsel wird die Passwort-Angabe tatsächlich als Änderung übernommen.

    Das Feld Passwort im Datagridview dient nur zur Kontrolle, ob bzw. wann eine Passwort-Änderung übernommen wurde.

    Daher stammt auch meine Idee, ein eigenes Control einzusetzen, welchen alle Eigenschaften und Methoden eine normalen Textbox haben soll, nur mit dem Unterschied, dass vor der Übergab die Angabe verschlüsselt werden, beim Anzeigen wäre es genau umgekehrt; alle anzuzeigenden Inhalten müssen erst entschlüsselt und anschließend angezeigt werden. Dann wäre alles im DataGridview und nicht in einer bzw. sogar zwei seperaten Textbox(en).

    Fällt da noch jemand eine Idee ein, um bei einer Änderung in der seperaten Passwort-Textbox die Angabe im DatagridView übernehmen zu können?

    Nachtrag:

    Bin bei der Suche nach einer Lösung auf eine Schnittstelle IFormatProvider gestoßen: msdn.microsoft.com/de-de/libra…atprovider(v=vs.110).aspx

    Hier wird ein Wert für die Anzeige "formatiert" ausgegeben. Demnach könnte man auch an dieser Stelle die Byte-Folge als Normalen Text formatiert ausgeben.

    Bleibt noch Offen, ob es auch umgekehrt geht: Bei einer Eingabe muss der formatierte Text wieder in Bytes-VFolge umgewandelt werden.

    Das Ganze muss anschließend noch an eine DataGridView Textbox angebunden werden.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BigBen2003“ ()