Bindung zeigt nur ein Feld (Plz Ort Vorwhal)

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bindung zeigt nur ein Feld (Plz Ort Vorwhal)

    Morgen zusammen,

    ich habe ein DGV mit einigen Spalte.
    ID - Name - Vorname - PLZ_ID - Anrede_ID, Titel_ID

    ComboBoxen gebunden an Tabelle
    Anrede_ID Titel_ID PLZ_ID

    Bei der Auswahl von Anrede und Titel geht das ganze ja schnell.

    Bei PLZ ist das nicht so einfach.
    erste Problem:
    - es sind über 19tausend PLZ, das dauert einen Moment
    zweite Problem
    - zeige ich in der ComboBox die Orte an, nach denen ich auch suchen kann, sehe ich die anderen Daten nicht.

    Nun habe ich bei Beth Massi eine Lookup Tabelle gesehen.
    leider weis ich nicht wie ich, wenn ich eien LookUp Tabelle/Ansicht bastel, wie ich diese dann noch an die o.G. ComboBox Binden kann ?

    ich brauche eine übersichtliche Suchansicht, nach Auswahl des Datensatz soll die ID an die Tabelle mit den Adressen weitergegeben werden.


    puh,
    ich und erklären


    danke euch

    Bernd

    Edit:
    Vielleicht anders erklärt.

    Ich habe eine Tabelle mit Adressdaten. In dieser Tabelle befindet sich ein Feld "PLZ_ID". Also die ID aus der Postleitzahlen Tabelle.

    Dort möchte ich die ID der Postleitzahlen Tabelle eintragen.

    Weil es aber über 19Tausend PLZ in Deutschland gibt ist es sehr unübersichtlich wenn ich in der DGV eine ComboBox habe.
    Es funktioniert, klar. Binde ich die ComboBox an der PLZ ID und lasse mir den Ort anzeigen, speicher jedoch die PLZ ID.
    Angezeigt bekomme ich dann eine Liste mit allen Orten. Aber auch nur die Orte.
    Da ber z.B Köln mehrfach in der Liste vorkommt, ich aber nicht den Ortsteil und auch nicht die PLZ angezeigt bekomme, ist das auswählen dann gleich einem Ratespiel.

    Nun möchte ich eine DGV oder Form haben, in der ich den Ort auswähle, dort wereden mir auch die PLZ und die Tele Vorwahl angezeigt.
    Nachdem ich mich dann für eine PLZ bzw. Ort entschieden habe, soll der Index in die Adress Tabelle übernommen werden.

    Wie geht das ?

    danke
    Bernd

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

    Hi Bernd,

    du könntest z.B. in der Abfrage eine neue Spalte generieren, in der du die PLZ und den Ortsnamen in eine Spalte steckst. Dadurch hättest du in der ComboBox z.B. die Anzeige '12345 Gemeinde-Ortschaft' und als Value-ID behältst du weiterhin die PLZ_ID.

    VB.NET-Quellcode

    1. SELECT PLZ_ID,...., PLZ & ' ' & Ort AS [Wohnort], ...


    ...und das mit den 19T-Postleitzahlen, willst du dein Programm verbreiten oder nur in der weitläufigen Umgebung benutzen ? Bei den 19T PLZs sind ja nur die Gemeinden drinnen. Wenn du dann auch noch anfängst und die Ortschaften mit rein nimmst wird es noch mehr.
    Ich hatte das auch mal so vor, habe es dann aber so gemacht, dass ich die PLZs aus der umliegenden Region benutzt habe und weitere von Hand eingeben könnte. Es nimmt halt schon Zeit in Anspruch, das alles einzuladen.

    Gruß
    HerrFrie

    EDIT : Beispiel im Anhang VB2010
    Dateien
    • PLZ.ZIP

      (788,78 kB, 185 mal heruntergeladen, zuletzt: )

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

    Bernd schrieb:

    19Tausend PLZ

    Das ist nicht nur ein Problem der Lade-Geschwindigkeit.

    19000 Datensätze kann man ühaupt nicht präsentieren, prinzipiell nicht, und schon garnicht in einer Combobox.
    Also theoretisch schon machbar, aber wer das benutzen muß, der kriegtn Vogel.

    mit AutoCompletion kann man vlt. was machen, aber die dürfte auch erst anspringen, wenn der Bereich der noch gültigen Eingaben auf ein menschen-verträgliche Anzahl geschrumpft ist.
    Ziemlich schwierig, und auch nicht befriedigend.

    Am ehesten machbar ist eine Validierung. Also der Usser muß schon die PLZ ohne Hilfe eingeben, und bekommt immerhin eine Rückmeldung, wenner eine Eingabe macht, die garnet gültig sein kann (etwa 99... - gibts nicht - oder?)

    @HerrFrie: gar nicht schlecht, findich. immerhin kann man die erste Ziffer schonmal ansteuern, und das mit den Ortsnamen sieht so menschlich wie möglich aus.

    Aber richtig ergonomisch würde man sich wünschen, dasser auch bei weiteren Ziffern die Auswahl weiter einschränkt, oder zum nächsten Treffer hopst.

    Aber wie gesagt: ich wüsstenicht, wie das mit einer Combobox gescheit hinkriegen.

    Hmm - 99... gibts doch.
    Und die Ziffern-Steuerung macht irgendwas unnachvollziehbares, wenn man mehrmals dieselbe Ziffer drückt. :(

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

    Hab gerade mal selber nochmal rumprobiert.

    Ich weiß auch nicht, ob die Combo sich so immer verhält, ist mir bis jetzt noch gar nicht aufgefallen.
    Wenn du die Combo anklickst und eine Postleitzahl zügig eingibst, funktioniert das Autocomplete ohne dass ich da noch extra was eingestellt hatte.

    Drückst du z.B. eine 5 und wartest einen Moment, so fängt er bei der als nächstes gedrückten Zahl wieder von vorne an.

    Einträge sind in meinem Beispiel knapp 15.000 drinnen, weiß nicht von wan die Liste ist, auf jeden Fall 5 stellige PLZ :D .

    Ich würde einfach auf den Komfort verzichten und alle PLZs bei der Eingabe eines Mitglieds in die DB aufnehmen. Dadurch hast du weniger Leichen abgespeichert, die niemand benutzt.
    Und es macht mehr Sinn, die Ortschaften mit abzuspeichern. Die Anzeige z.B. 57482 Wenden sagt trotzdem nichts genaueres zu dem Wohnort aus. Da macht es mehr Sinn zu schreiben 57482 Wenden-Hillmicke, 57482 Wenden-Heid.
    Hi,


    ich habe das mal als Screen.
    Die erste obere Tabelle beinhaltet die PLZ.
    Die untere Tabelle die Adressen. (Ist erst der Anfang)

    Nun suche ich anhand der TextBoxen, nach der PLZ oder nach der Stadt.
    Das wird dann Gefiltert. Geht auch.

    wie bekomme ich jetzt von der oberen Tabelle die ID in die untere Tabelle in das Feld (PLZ_ID) ?


    folgendes Bild.


    zwei Tage hab ich versucht über irgendwelche Bindungen.

    ich bekomme die Kurve nicht.

    vielen dank

    Bernd
    Willst du die beiden Grids denn getrennt haben oder nur eins, wo alles drinnen steht ?

    Wenn du nur eins haben möchtest, hat der Erfinder ein Tut was das beschreibt.
    EDIT : ich glaube das hier war das : ParentChildView

    Du ziehst quasi beide Tabellen nacheinander in den Designer und bearbeitest dann das dadurch erstellte Datagrid. Dort kannst du dann die jeweiligen Spalten hinzufügen.
    Am einfachsten ist es dann, wenn du Spalte PLZ_ID als ComboBoxColumn deklarierst. Dadurch hast du dann die Möglichkeit, dass über DataMember und ValueMember zu binden.

    Kannst du dir in meinem Beispiel ansehen. Hast du das ans laufen bekommen ?
    Klicj mal in das Grid und dann rechts oben auf den kleinen Pfeil bei Spalten bearbeiten. Dort stehen dann die einzelnen Eigenschaften der Spalten.
    Hallo HerrFrie,

    ja ich habe dein Beispiel ans laufen bekommen.
    Leider blicke ich nicht ganz durch. bin ich ja ehrlich.

    Ja oben die beiden Tabellen sehen gut aus, finde ich. Zumindest kann mann sehr schön suchen und auch alle Werte sehen.

    Ich habe übrigens deinen Tip aus deiner vorherigen Antwort mal durchdacht. Dabei ist mir eingefallen.
    Bevor ich die Tabelle mit den PLZ lade, frage ich ab, welcher Verein sich gerade anmeldet,
    Dort lese ich dann die PLZ aus, kann darauf Rückschluss ziehen aus welchem BundesLand der Verein kommt.
    Nun kann ich die PLZ Tabelle einlesen. Dann sind es nur noch ca.. 800 DatenSätze un keine 19Tausend mehr.
    Geich ich dann den Ort oder die PLZ ein, filtert das Ding rasend schnell.
    Also ich denke eine schöne und schnelle Lösung.


    Das mit der ComboBox in der DGV habe ich auch in verschiedenen Varianten versucht.
    Leider erwische ich ständig die falsche Bindung. (Weil es mir noch nicht ganz Einleuchtet)

    Die Tabelle mit den Adressen soll ja weiter ausgebaut werden.-
    Dort möchte ich eigentlich nur den Vornamen, Namen u. das GeburtsDatum als Volltext drin haben.
    Alle anderen Felde sind dann ID' aus anderen Tabellen.
    PLZ, BLZ, KfZ Kennzeichen, Bundesland, Land, Telefon Vorwahl ...........

    Wenn sich etwas ändert, brauche ich nur die (Versorgungs) Tabelle zu ändern.

    Ja wie gesagt, ich bekomme die Bindung nicht hin.
    Ist es eine 1:1 Relation oder eine M:N Relation ?

    HerrFrie schrieb:

    Klicj mal in das Grid und dann rechts oben auf den kleinen Pfeil bei Spalten bearbeiten. Dort stehen dann die einzelnen Eigenschaften der Spalten.

    Alles gefunden und deins Läuft auch,
    Genau so ist da auch Übersichtlich.

    vielen dank

    Bernd

    Edit:
    ich mache mal einen Entwurf wie es denn aussehen Soll.



    Also oben die Register,
    die klicke ich alle durch, wenn ich am Ende angekommen bin sollten unten der Tabelle alle Felder ausgefüllt sein.

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

    HerrFrie schrieb:

    du könntest z.B. in der Abfrage eine neue Spalte generieren, in der du die PLZ und den Ortsnamen in eine Spalte steckst. Dadurch hättest du in der ComboBox z.B. die Anzeige '12345 Gemeinde-Ortschaft' und als Value-ID behältst du weiterhin die PLZ_ID.

    Visual Basic Quellcode
    1
    SELECT PLZ_ID,...., PLZ & ' ' & Ort AS [Wohnort], ...



    Hi,
    wie kann man den so eine Spalte bauen ?

    Also das PLZ und Ort in einer ComboBox auftauchen.
    Wo macht man eine solche Abfrage ? und wie ?

    lieben dank
    Bernd
    Also,

    du erstellst im DS-Designer die Relationen. Dort gehst du dann einfach auf den TabelAdapter wo die PLZs und Orte drinnen sind und klickst (rechtsklick) auf Konfigurieren.
    Im Abfragekonfigurator kannst du dann einfach per Hand in die SELECT Zeile einfügen :

    VB.NET-Quellcode

    1. , (PLZ & ' ' & Ort) AS [Wohnort]


    Kannst das mit dem Button Abfrage ausführen testen.
    So hat die Tabelle schon einmal ein kombiniertes Feld.

    Dann ziehst du im normalen Designer die Tabelle mit dem Namen und Vorname rein. Zusätzlich ziehst du die übrigen Tabellen auch da rein, wo du aus der Tabelle mit den Namen nur die IDs stehen hast (Anrede_ID, Title_ID).

    Rechts in den Eigenschaften stellst du die DataSource wieder auf die erste Tabelle(Haupttabelle) ein.

    Im Designer hast du für das DGV den kleinen Pfeil rechts oben. Da klickst du auf Spalten bearbeiten und kannst dann die Spalten für die IDs von ...Textbox auf ...Combobox ändern. In den Eigenschaften im selben Fenster kannst du nun auch DataSource, DataMember und ValueMember auswahlen.
    Für DataSource wählst du 'Weitere Datenquallen' aus, Form1-Listeninstanzen und dann das DataSet
    Bei DataMember suchst du dir z.B. in der Tabelle für Title den Title aus.
    Bei ValueMember suchst du dir in der Tabelle für Title die Title:ID aus.

    Fertig. Jetzt wird im DGV anstelle der Spalte Title_ID (und der Zahlen) der dazugehörige Title angezeigt, der mit der Title_ID übereinstimmt. Und du kannst diese über die Combo einfach ändern.

    Ich hoffe es war nicht zu kompliziert ausgedrückt.

    Wenn du das über 2 getrennte DGVs machen willst werde ich heute Abend mal zu Hause nachschauen, ich meine ich hätte in einem Buch ein Beispiel in VB08.

    GRuß
    HerrFrie

    HerrFrie schrieb:

    Im Abfragekonfigurator kannst du dann einfach per Hand in die SELECT Zeile einfügen :

    Visual Basic Quellcode
    1
    , (PLZ & ' ' & Ort) AS [Wohnort]


    Hier habe ich mal alle Variationen ausgetestet.
    mit und ohne Klammern, mit und ohne Hochkomma, auch kombiniert.
    er macht es nicht. (ich arbeit mit mysql)

    es schein als würde er rechnen wollen.

    Mit & geht garnicht, dfür habe ich + genommen.

    den rest test ich heute abend. muss wieder weg.

    danke erstmal

    Bernd
    Hmm,

    ich dachte immer, dass das & immer funktioniert. Habe bei mir OleDB, da gehts. Bis jetzt hatte ich überall immer Verpönung gelesen, wenn jemand Strings etc. mit + kombiniert hat.
    Aber es ist ja hier keine String sondern eine Kombination, mag sein dass dies dann bei MySql anders ist.


    Meld dich mal nach dem Testen.

    Beim Testen mit OleDB ging beides, vielleicht ist dann aber das + richtig, wenn es in MySQL auch funktioniert.

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

    Hallo HerrFrie,

    ich bin dem Ding auf der Spur.

    Übrigens damit

    Bernd schrieb:

    Im Abfragekonfigurator kannst du dann einfach per Hand in die SELECT Zeile einfügen :

    Visual Basic Quellcode
    1
    , (PLZ & ' ' & Ort) AS [Wohnort]

    Ich habe das über die Expressions gelöst. Dort kann man eine zusätzliche Spalte erzeugen.
    Mit PLZ und Ort zusammen.
    Brauche ich aber nicht.

    Das was ich gesucht habe ist einfacher als ich dachte.

    Alle Tabellen ins DataSet ziehen. -> Adressen, Anreden, Titel, PLZ.
    Keine Bindung (Relation). überflüssig.
    Adressen Tabelle auf die Form ziehen.
    PLZ Tabelle auf die Form ziehen.

    Jetzt in der DGV die Spalten von Text auf ComboBox ändern.
    Über die BindigSource einstellen.
    AredenBindingSource -> DisplayMember -> Value Member.
    Natürlich bei Titel PLZ auch


    Dann noch im DGV der Postleitzahlen im Cell_Doppelklick

    VB.NET-Quellcode

    1. Dim AdressRow As DataSet1.AdressenRow
    2. AdressRow = DataSet1.Adressen.FindByAdr_ID("1")
    3. AdressRow.PLZ_ID = 8763


    Natürlich nicht Hardgekodet sondern Variabel über die e.Row der DataGrid View, die Nötige ID auswählen.

    Mit den anderen ID natürlich auch noch.

    Das wars dann auch schon.


    Puh, so einfach.


    Danke dir

    Bernd

    Edit:
    keine Ifos gefunden bei
    Beth Massi
    Meine Bücher
    Galileo
    EDR
    Bücher
    vbarchiv.net/workshop/workshop…-ohne-ado-und-myodbc.html
    dev.mysql.com/doc/refman/5.1/d…r-net-using-datetime-null
    vb-magazin.de/forums/forums/t/5540.aspx
    openbook.galileocomputing.de/v…5_ado_dataadapter_001.htm
    vb-magazin.de/forums/forums/p/4730/18412.aspx
    akadia.com/services/dotnet_databinding.html
    openbook.galileocomputing.de/v…86577fb1bea9ea6143ac96449
    little-idiot.de/mysql/mysql-122.html

    tutorialspoint.com/mysql/mysql-where-clause.htm

    Videos
    msdn.microsoft.com/de-de/bb466226.aspx?wt.slv=RightRail -> Lukas
    msdn.microsoft.com/en-us/vbasic/ff718212 -> ErfinderDesRades

    Bath Massi
    blogs.msdn.com/b/bethmassi/
    Hallo Bernd,

    ich glaube nicht, dass die Relationen überflüssig sind. Bei der Erstellung magst du vielleicht den Eindruck haben, aber diese dienen zum richtigen Handling beim Abspeichern und Löschen, soweit ich weiß. Machen solltest du diese auf jeden Fall.

    Und mit der PLZ und dem Ort dachte ich, du wolltest ein Feld haben, in dem dem beides zusammen angezeigt wird. Wahrscheinlich hast du das aber jetzt anders gelöst und benötigst das so nicht mehr ?
    Hallo HerrFrie,

    erst das Bild dann die erklärung.


    Du siehst oben Links ein DGV mit PostLeitzahlen und Vorwahlen.
    Über dem DGV habe ich Filter eingebaut um die Daten Menge zu reduzieren und das ganze übersichtlicher zu machen.

    VB.NET-Quellcode

    1. Private Sub Btn_Suche_Ort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Suche_Ort.Click
    2. Me.PLZ_VorwahlBindingSource.Filter = String.Empty
    3. Me.PLZ_VorwahlBindingSource.Filter = "Ort LIKE '" & "%" & Txbo_Suche_Ort.Text & "%" & "'"
    4. End Sub
    5. Private Sub Btn_Suche_PLZ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Suche_PLZ.Click
    6. Me.PLZ_VorwahlBindingSource.Filter = String.Empty
    7. Me.PLZ_VorwahlBindingSource.Filter = "PLZ LIKE '" & "%" & Txbo_Suche_PLZ.Text & "%" & "'"
    8. End Sub
    9. Private Sub Txbo_Suche_PLZ_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Txbo_Suche_PLZ.KeyDown
    10. If e.KeyCode = Keys.Enter Then
    11. e.Handled = True
    12. Btn_Suche_PLZ_Click(Nothing, Nothing)
    13. 'MsgBox(DirectCast(sender, TextBox).Name)
    14. End If
    15. End Sub
    16. Private Sub Txbo_Suche_PLZ_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Txbo_Suche_PLZ.KeyPress
    17. ' Nur Nummern zulassen
    18. Select Case e.KeyChar
    19. Case ControlChars.Back
    20. Exit Sub
    21. Case "0"c To "9"c
    22. Exit Sub
    23. End Select
    24. e.Handled = True
    25. End Sub

    Somit habe ich einen schnellen zugriff.
    Das ganze läuft über mehrere DataSet. mehr dazu später


    Das gleiche habe ich dann mit den Banken und Bankleitzahlen gemacht.
    Nun wähle ich unten in der Adressen DGV die Adresse, die ich bearbeiten möchte, aus.
    Jetzt reicht ein Doppelklick auf der PLZ DGV, ausgewählte Spalte, um die Daten in die Adress DGV zu übernehmen.
    Das gleiche gilt für DGV Banken.
    In der Adressen Tabelle habe ich die ComboBoxen über einen Binding an die ID der oberen Tabellen gebunden.
    Somit stehen dort in der Realität die ID drin.

    Die Übergabe der Daten erfolgt dann über den DoppelClick auf CellDoubleClick

    VB.NET-Quellcode

    1. Private Sub BankenDataGridView_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles BankenDataGridView.CellDoubleClick
    2. Dim AdressenRow As DataSet1.AdressenRow
    3. ' Finde die Adresse mit der ID 1 -> also Bernd, weil sie im DGV ausgewählt ist
    4. AdressenRow = DataSet1.Adressen.FindByAdr_ID(AdressenDataGridView.Rows(AdressenDataGridView.CurrentRow.Index).Cells(0).Value)
    5. ' übernehme die Passende ID aus der DGV Banken
    6. AdressenRow.Adr_Bank_ID = BankenDataGridView.Rows(e.RowIndex).Cells(0).Value
    7. End Sub


    Bis hier hin hat das noch nichts mit einer Relation zu tun.


    Erklärung später:
    Warum zwei DataSet:
    Wenn ich in z.B. Banken DGV über den Filter eine Banken Gruppe gefiltert habe

    VB.NET-Quellcode

    1. Private Sub Btn_Suche_Bank_Ort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Suche_Bank_Ort.Click
    2. Me.BankenBindingSource1.Filter = String.Empty
    3. Me.BankenBindingSource1.Filter = "Bank_Ort LIKE '" & "%" & TxBo_Suche_Bank_Ort.Text & "%" & "'"
    4. End Sub

    Existieren vielleicht genau die Banken, die unten im Adress DGV gebraucht werden, nicht mehr in der Tabelle.
    Ergo kommt eine Fehlermeldung. Index Out Of Range.

    Also ein DataSet für die Daten die Später gespeichert werden
    und ein DataSet für die Auswahlen.

    Bisher immer noch keine Relation.
    Nur Typisiertes DataSet.

    Designe:
    Das ist nur ein Test Projekt damit ich mir das Programmieren an DatenBanken erklären und verstehen lerne.
    Also kein Wert auf aussehen sondern nur auf Funktionalität.


    Nochmals Lieben dank für deine Heftige und Super Hilfe


    Bernd
    vlt. käme für den Fall auch ein EinzelblattView über ein Extra-Form in Frage.
    also dass alle Daten erstmal Readonly aufgelistet werden, und bei Doppelklick auf einen Datensatz, dass dann ein Form mit EinzelblattView dieses Datensatzes aufgeht, den man bearbeiten kann.
    Und am Schluß der Bearbeitung drückt man Ok oder Cancel.

    Weil dein Screeni zeigt ein ziemlich vollgestopftes Form, und die eigliche Info ist ja nur das untere Grid, die oberen beiden sind ja eiglich nur Auswahl-Felder.