TextboxColumn in DGV, BindingSource per Designer?

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    TextboxColumn in DGV, BindingSource per Designer?

    Guten Abend zusammen,

    ich habe mal eine Rückfrage: Wenn ich im DGV per Designer die BindingSource festlegen will für z.B. eine TextBox im DGV, geht das so wie ich das gesehen habe nicht im Designer. Geht es aber per Code?

    Freue mich auf eine Rückmeldung.
    Im DGV wird ja eine DataTable o.ä. repräsentiert. Da kann man jetzt nicht sinnvollerweise eine Zelle an eine Sache binden und die restlichen Zellen der Spalte nicht. Kommt jetzt drauf an, was Du konkret vorhast. Geht es Dir um ne AutoCompletCustomSource oder was anderes? Beschreib mal bitte Dein Vorhaben so konkret wie möglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Also ich habe eine DataTable Hardware mit ID, Name und SupplierID u.a. und einen DataTable Supplier mit ID und Name.
    Dann habe ich eine DataTable Workplace mit ID, HardwareID und SupplierID (für Hardware), SoftwareID und SupplierID (für Software) u.a. . Diese SupplierID will ich jeweils als TextBox anzeigen.

    Aktuell wird mir bei Workplace die korrekte HardwareID angezeigt in einer ComboBoxColumn gemäß Binding im Designer aber die SupplierID wie binde ich die an eine TextBoxColumn?

    Hoffe das meine Frage so richtig rüberkam.

    AutoCompletCustomSource


    Damit kann ich leider nichts anfangen. Wenn das damit gemeint ist, nein keine Collection. In der Table Workplace (HardwareID) ist ein Bindung zum Table Hardware und im Table Hardware (SupplierID) ist ein Binding zum Table Supplier. Nun soll dieser Supplier aus der Hardware im DGV angezeigt werden (bzw. im Table Workplace).
    Bilder
    • Relations.PNG

      58,21 kB, 1.238×869, 35 mal angesehen
    • HardwareID.PNG

      31,5 kB, 933×586, 30 mal angesehen
    • SupplierID.PNG

      30,37 kB, 933×586, 22 mal angesehen

    Sam85 schrieb:

    Aktuell wird mir bei Workplace die korrekte HardwareID angezeigt in einer ComboBoxColumn gemäß Binding im Designer aber die SupplierID wie binde ich die an eine TextBoxColumn?
    Da der Satz ohne ausreichend Interpunktion ist, weiß ich leider nicht, was Du damit sagen willst oder insgesamt erreichen willst. Du hast ein DGV. Da wird dank der Designereinstellung statt der Hardware-ID der Hardware-Name laut Hardware-Tabelle angezeigt. OK. Und statt der Supplier-ID willst Du was anderes angezeigt bekommen? Den Namen? Aber ohne ComboBox-Column? Das geht im Designer nicht. Aber Du könntest Die ComboBoxColumn so ändern, dass es so aussieht, als wäre es eine TextBoxColumn: DisplayStyle auf Nothing stellen. Falls das keine akzeptable Lösung ist: Warum nicht? Was soll anders sein?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed

    VaporiZed schrieb:

    Da der Satz ohne ausreichend Interpunktion ist


    Entschuldige meine Interpunktionslosigkeit :). So besser?
    Aktuell wird in der DataTable "Workplace", die HardwareID mit dem Displaymember "Name", korrekt durch das Binding in der ComboBoxColumn angezeigt.
    Jedoch will ich in dem selben DataTable, die SupplierID aus dem DataTable "Hardware", in einer TextBoxColumn "Name" mit dem Displaymember anzeigen. Diese kommt aus dem DataTable "Supplier".

    Hmm die Option mit dem DisplayStyle klingt gut, werde ich mal testen.
    Kann man mit Codebehind das Binding an der TextBoxColumn bewerkstelligen? Oder ist die generell nicht dafür vorgesehen?

    EDIT:
    Ich will nochmal sicher gehen, dass ich es richtig versuche. Ich binde die ComboBoxColumn der SupplierID an den DataTable der Hardware. Dann habe ich zwar als ValueMember die SupplierID aber wie gestalte ich dann den DisplayMember (Name ist dann ja Hardware und nicht Supplier)? Oder muss ich das dann im Code Behind den ValueMember mit DirectCast zum Name casten?
    Bilder
    • SupplierID.PNG

      33,29 kB, 996×617, 30 mal angesehen

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

    Leider das einzige, was mir auf Anhieb eingefallen ist.
    Dateien
    • WindowsApp1.zip

      (22,63 kB, 10 mal heruntergeladen, zuletzt: )
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @Sam85 Wenn ich dich richtig verstanden habe:
    Du könnest dir eine Column mit einer Expression in der Tabelle Workplace machen...
    Parent(FK_Hardware_Workplace).Name
    Dann hast du z.B. den Namen der Hardware in der Tabelle Workplace...
    Wenn du jetzt aber den Supplier holen möchtest, kannst du das nicht über 2 Tabellen hinweg machen. Da musst du dir eine eigene Relation von Tabelle Workplace zu Supplier machen und die verwenden.
    Child(Workplace_Supplier).Name

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

    @VaporiZed
    Das entspricht meiner Vorstellung. Kann ich sowas auch direkt im Konstruktor machen? Oder ist es besser im Form Load?

    VB.NET-Quellcode

    1. For i = 0 To BsUsers.Count - 1
    2. BsUsers.Position = i
    3. Dim CurrentSupplierID = DirectCast(DirectCast(BsUsers.Current, DataRowView).Row, Tds.UserRow).HardwareRow.SupplierID
    4. Dim CurrentSupplier = Tds.Supplier.First(Function(x) x.ID = CurrentSupplierID)
    5. DgvUsers.Rows(DgvUsers.CurrentCell.RowIndex).Cells(2).Value = CurrentSupplier.Name
    6. Next

    EDIT:
    Kann ich das auch mit einer For Each Schleife durchführen?

    @VB1963
    Die Relation hatte ich vorher auch gehabt. Dann dachte ich mir aber: Es reicht doch die HardwareID im Workplace Table weil im Hardware Table habe ich ja die SupplierID. Und somit stehen die beiden ja in Beziehung, wie du sagtest über 2 Tabellen hinweg. Kann ich die Expression dann irgendwie verschachteln?

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

    Konstruktor und Form_Load: Probier es aus, ich vermute aber mal, dass das nicht geht, weil da noch keine Daten im DGV stehen. Außerdem sollte das in ner eigenen Funktion bleiben, da Du das bei neuen Zeilen oder Änderungen ebenfalls ausführen musst. Also: Einmal in Form_Shown und einmal in ... DGV_CellEndEdit? Oder vielleicht auch DGV_CellValidated. Probier und berichte. Mit For Each geht es, ist aber n gutes Stück umständlicher und dümmstenfalls auch unsicherer:

    VB.NET-Quellcode

    1. For Each ID In BsUsers.Cast(Of DataRowView).Select(Function(x) x.Row).Cast(Of Tds.UserRow).Select(Function(x) x.ID)
    2. BsUsers.Position = BsUsers.Find("ID", ID)
    3. Dim CurrentSupplierID = DirectCast(DirectCast(BsUsers.Current, DataRowView).Row, Tds.UserRow).HardwareRow.SupplierID
    4. Dim CurrentSupplier = Tds.Supplier.First(Function(x) x.ID = CurrentSupplierID)
    5. DgvUsers.Rows(DgvUsers.CurrentCell.RowIndex).Cells(2).Value = CurrentSupplier.Name
    6. Next

    Hab gesehen, dass ich die falsche Table hergenommen hab. Du wolltest ja Workplace und nicht User haben. Aber vom Prinzip ist es ja rübergekommen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed

    Im Konstruktor macht es ohne Daten keinen Sinn, :) wohl wahr. Habe es deinem Beispiel nachempfunden, dass hat gut geklappt.
    Was macht das For Each denn unsicherer? Ja das Prinzip ist angekommen. Vielen Dank.

    Nebenbei, wenn ich die Spalte im Relation Designer weglasse aber im Table ungebunden hinzufüge, ist das ein ungünstiges Verhalten für ein typisiertes Dataset? Und kann ich die Column 2 (.Cells(2).Value) durch den Column Namen ersetzen?
    Einmal das LINQ-Geschwurbel mit Cast und Select ist komplizierter.
    Und inwieweit BsUsers.Find("ID", ID) da immer hinhaut, kann ich Dir auch nicht sagen. Ich sehe auf Anhieb kein Problem. Aber den vollen (Über)Blick habe ich nicht. Mit NameOf könnte man es ggf. sogar compilerfest machen, da ich mit Stringsuche nach einer Column nie glücklich werde, aber das ist nochmal was anderes.
    Wenn Du ne ungebundene Spalte dem DGV hinzufügst, juckt das das tDS gar nicht. Das geht total an dem vorbei.
    Column-Indices durch Column-Namen ersetzen: da sind wir wieder beim Anfang meines Posts.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    ​Wenn du jetzt aber den Supplier holen möchtest, kannst du das nicht über 2 Tabellen hinweg machen. Da musst du dir eine eigene Relation von Tabelle Workplace zu Supplier machen und die verwenden.


    Man kann den Supplier Namen durch die Hardware Datatable "durchreichen".







    Es sei den ich hab das Problem komplett falsch verstanden.^^

    LG Maffi

    Maffi schrieb:

    durchreichen
    Das hätte ich jetzt nicht geglaubt, das das geht - man lernt nie aus :-) (das hatte ich schon einmal probiert und gelang mir nicht, warum auch immer?)
    @Sam85
    Das Problem oben ist meiner Meinung nach, das in der WorkPlaceTabelle 2 verschiedene Supplier auftreten können (der eine von der Hardware- und der andere von der Softwareseite)
    Und desshalb 2 Spalten Supplier von Nöten sind... Je nach dem was man jetzt will...

    @VB1963

    Exakt, den Gedanken hatte ich auch aber das macht ja nichts. Weil die ID bleibt ja die ID und ich trage die ja im jeweiligen Table (Hardware oder Software) mit ein, sollte ich den DirectCast verwenden wie @VaporiZed geschrieben hatte.

    @Maffi
    Das mit dem Durchreichen, setzt das dann den Namen im Workplace Table voraus oder geht das dann auch mit der ID in der Expression, so das am Ende der Name rauskommen kann?

    Sam85 schrieb:

    setzt das dann den Namen im Workplace Table voraus
    Dazu brauchst die Beziehung zwischen den beiden Tabellen und mit dieser bildest du deine Expression zum SupplierNamen...
    Hat @Maffi oben rot eingegringelt... Eine eigene FK vom Supplier findest du da nicht in der WorkplaceTabelle!
    @VB1963

    Daraus entnehme ich: der Supplier Tabele hat die ID, der Hardware Table hat die FremdkeyID und Namen und Workplace hat dann den Namen und so könnte ich es mit der Expression durchreichen. Oder aber mit dem DirectCast direkt über die ID.