combobox ohne duplikate aus dgv füllen

  • VB.NET

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

    combobox ohne duplikate aus dgv füllen

    Hallo,

    wie kann Ich eine combobox aus einem dgv füllen ohne die duplikate mit hinzuzufügen ?

    Da gibt es doch bestimmt ne möglichkeit ohne jeden Wert einzelnd zu vergleichen. Das sind ca 30.000 Einträge ;(
    "Mann" lernt mit seinen Projekten.
    1. du kannst die Combo an ein DataView binden, welches mit LinqToDataset erzeugt wurde, weil Linq unterstützt das Distinct - Schlüsselwort.

    2. Aber bei 30000 Einträgen, mw. reduziert auf 1000 - wer will aus einer Combo mit 1000 Einträge was raussuchen?

    3. Bei korrekter Datenmodellierung entstünden übrigens gar keine Duplikat-Werte in den Datensätzen.

    ErfinderDesRades schrieb:

    Bei korrekter Datenmodellierung entstünden übrigens gar keine Duplikat-Werte in den Datensätzen.

    Ich habe eine tables, in dem 30000 Artikel sind, viele dieser Artikel habne den gleichen Preis.

    zb 10000 haben 10€
    20000 haben 20€

    ich möchte nun ein Auswahlfeld füllen, wo ich dann 10 und 20 zur auswahl habe.
    Natürlich kenne ich nicht den genauen inhalt der Tabelle, deswegen muss ich ja die duplikate rausfiltern.

    Ich werde mir aber mal das mit dem Linq anschauen.


    Thx
    "Mann" lernt mit seinen Projekten.
    Das Beispiel mit den Preisen hat nichts direkt mit meiner DB zu tun.
    Es ging nur um das Beispiel.

    Ich werde mir auf jeden fall die Möglichkeit mit Linq anschauen.

    Gibt es es noch eine Alternative, mit der Ich halt eine Spalte einlese und jeweils nur einmal einen Wert oder Begriff in eine Liste schreibe.
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Das Beispiel mit den Preisen hat nichts direkt mit meiner DB zu tun.
    Es ging nur um das Beispiel.
    Mit anderen Worten: Du verarschst mich, indem du von iwelchen Sachen faselst, die garnet existieren.
    Ohne realere Infos bleibts halt bei der Allgemein-Aussage: Ordentliche Datenmodellierung erübrigt üblicherweise Daten-Dubletten.

    ErfinderDesRades schrieb:

    Mit anderen Worten: Du verarschst mich
    Tut mir leid, das war so nicht beabsichtigt.
    Ich habe nur versucht ein Beispiel zu finden, mit dem jeder etwas anfangen kann. (naja, ist wohl daneben gegangen)

    Dann werde Ich es mal mit mehr details versuchen um auch zu zeigen, dass es dort doppelte eintrgäge geben kann.

    Hier habe Ich ein screenshot von Meiner Tabelle


    Ich bekomme oben in der Box "Filter" jeweil die columns namen angezeigt.
    Dann wähler Ich einen operator aus und zu guter letzt kommt die Liste die Ich mit einer auswahl füllen will.

    Wenn ich also die column "Wkz" auswähle, soll in der Liste dann '1011050' und '1011110' aufgelistet werden.
    Oder bei "ParameterNamen" dann dementsprechend 'Ausreumen' 'Radius' 'Sprühmittel' etc. wie man Bildlauf sehen, kommen dort noch einige Parameter, welche sich aber immer wieder wiederholen.

    Die Spalte "ID" ist uniq und über die kann Ich nachher auch in der DB änderrungen vornehmen.

    Hier habe Ich auch nochmal das Sub zum einlesen der Daten.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Form1.dgvMain.Columns.Clear()
    2. 'Profildaten lesen
    3. Dim con As New OleDbConnection
    4. Dim cmd As New OleDbCommand
    5. Dim reader As OleDbDataReader
    6. Dim table As New DataTable
    7. con.ConnectionString =
    8. "Provider=Microsoft.Jet.OLEDB.4.0;" &
    9. "Data Source=" & (Path.Combine(PfadDatenbank, "Profildatenbank.mdb"))
    10. cmd.Connection = con
    11. cmd.CommandText = " SELECT [NC-ParameterListe].IDParameterName," &
    12. " [NC-ParameterNamen].ParameterName, [NC-ParameterListe].Wert, [NC-ParameterListe].IDParameter, [NC-ParameterListe].ID," &
    13. " Bearbeitungsdaten.BNr, Bearbeitungsdaten.Wkz, Bearbeitungsdaten.YPos, Bearbeitungsdaten.ZPos, ProfilListe.Profilname" &
    14. " FROM ((([NC-ParameterListe]" &
    15. " INNER JOIN [NC-ParameterNamen] ON [NC-ParameterListe].IDParameterName = [NC-ParameterNamen].IDParameterName)" &
    16. " INNER JOIN Bearbeitungsdaten ON [NC-ParameterListe].IDParameter = Bearbeitungsdaten.IDParameter)" &
    17. " INNER JOIN ProfilListe ON Bearbeitungsdaten.IDProfilname = ProfilListe.IDProfilname)" & FilterLesen & ""
    18. Try
    19. con.Open()
    20. reader = cmd.ExecuteReader()
    21. table.Clear()
    22. table.Reset()
    23. table.Load(reader)
    24. Form1.dgvMain.DataSource = table
    25. reader.Close()
    26. con.Close()
    27. Catch ex As Exception
    28. MessageBox.Show(ex.Message)
    29. End Try
    30. Form1.dgvMain.Columns("YPos").DefaultCellStyle.BackColor = Color.SkyBlue
    31. Form1.dgvMain.Columns("ZPos").DefaultCellStyle.BackColor = Color.SkyBlue
    32. Form1.dgvMain.Columns("BNr").DefaultCellStyle.BackColor = Color.SkyBlue
    33. Form1.dgvMain.Columns("Wkz").DefaultCellStyle.BackColor = Color.SkyBlue
    34. Form1.dgvMain.Columns("Profilname").DefaultCellStyle.BackColor = Color.SkyBlue
    35. Form1.dgvMain.Columns("ParameterName").DefaultCellStyle.BackColor = Color.SkyBlue
    36. 'Form1.dgvMain.Columns("IDParameterName").Visible = False
    37. 'Form1.dgvMain.Columns("ID").Visible = False
    38. 'Form1.dgvMain.Columns("IDParameter").Visible = False
    39. Form1.dgvMain.Columns("YPos").ReadOnly = True
    40. Form1.dgvMain.Columns("ZPos").ReadOnly = True
    41. Form1.dgvMain.Columns("BNr").ReadOnly = True
    42. Form1.dgvMain.Columns("Wkz").ReadOnly = True
    43. Form1.dgvMain.Columns("Profilname").ReadOnly = True
    44. Form1.dgvMain.Columns("ParameterName").ReadOnly = True
    45. data_ready_ProfilListe = True
    46. Auswahlfelder_füllen()
    47. End Sub
    "Mann" lernt mit seinen Projekten.

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

    Wassich sage: eine Frage der Datenmodellierung.

    Wkz ist glaub die "WerkstoffKennziffer" verschiedener Werkstoffe (ich kenn sowas von Stahl-Legierungen), und eine ordentliches Datenmodell täte die Werkstoffe in einer extra-Tabelle vorhalten.
    Die Tabelle vom Screenshot würde auf diese Werkstoffe verweisen - evtl. könnte man ausnahmsweise die Wkz gleich als PrimKey hernehmen.

    Das DGV enthielte also eine ComboboxColumn, deren Einträge an die Wkz-Tabelle gebunden wären - ein Joining-View halt, wie etwa in vier Views erwähnt, oder in "Joining-View" auf Movie-Tuts vorgeturnt.
    Keine Ahnung wie Ich das beschreiben soll. Aber irgendwie versteht Ihr das falsch (denke Ich).
    Aber ev. ist meine Denkweise auch verkehrt.

    Trotz alle dem kann Ich an der DB struktur nix ändern.Egal ob richtig oder falsch.
    Er versuche um eine vorhandene DB drum herum zu programmieren.
    Aus veschiedenen Tabellen daten zusammenfügen, Werte ändern und dann dementsprechen zurück zu schreiben.

    Ihr habt mir auf jeden fall wieder auf einige Dinge aufmerksam gemacht, welche Ich in einem anderen Projekt, wo Ich die DB selber in der Hand habe anwenden kann.

    Im Kern dieses Beitrages ging es aber um folgendes.
    Ich denke Ich kann meine Frage jetzt auch besser spezifizieren.

    Man nehme ein DGV dort gibt es eine Spalte XY
    in dieser Spalte stehen folgende Werte:

    1
    1
    1
    5
    5
    8
    20
    20
    3
    3

    Nun möchte ich das diese Werte Uniq in eine Auswahl geschrieben werden.

    Also sol in der Liste dann:
    1
    3
    5
    8
    20

    stehen.

    Wie kann Ich das machen ?

    Ich habe kein dataset.
    Die daten gehen über einen table direkt in das DGV.
    "Mann" lernt mit seinen Projekten.

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

    Bitte nicht von dem Post #10 irritieren lassen.

    Das dotige dataset ist aus einem anderen Projekt.
    Ich habe das nur eingefügt um zu zeigen wie die DB aufgebaut ist.

    Ich lese die Daten direkt und individuell aus der DB aus. Denn es kann passieren, das die Einzulesende DB nicht ganz mit einer anderen übereinstimmt.(Je nach alter)

    Somit würden die columns nicht passen.
    Deswegen möchte ich mich nicht auf ein dataset festlegen.

    Das funktioniert auch schon alles wunderbar.
    Lesen schreiben filtern alles OK.

    Oder funktioniert das auch mit dem datatable? Damit meine Ich den Post #6
    "Mann" lernt mit seinen Projekten.

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

    Tja, dassisnu denkbar ungünstig.
    Du hast offenbar eine Datenbasis, für die gesteinigt gehört, wer die verzapft hat. Und kommst logischerweise nicht gut damit klar, und hoffst auf hilfreiche Tipps.
    In deinem verquasten Fall läuft das aber immer auf eine Weiter-Verquasung des eh verquasten Zeugs hinaus, also immer auf Vorgehensweisen, die man guten Gewissens niemandem empfehlen kann.
    Darüberhinaus sind dir die wirklich empfehlenswerten Vorgehensweisen noch ühaupt nicht geläufig.
    Also wenn man ühaupt eine Lösung findet, dann nur eine, die du schnellstmöglichst wieder vergessen solltest, und nochmal neu anfangen, die Thematik richtig zu erlernen.

    jdfs. die DataSource von deiner komischen Combo hat VB1963 dir ja schon sinnvoll angegeben. Dieser Linq-Ausdruck ist so flexibel, dasses egal ist, von welcher Auflistung die XY-Werte abgerufen werden. Irgendeine Auflistung wirst du ja haben, dann halt was anneres als typDataTable - wissen wir ja auch nicht.
    So, habe das von VB1963 probiert.
    So etwas hatte Ich auf jeden Fall gemeint.

    Natürlich währe Ich nicht in diesem Forum, wenn Ich nicht das naechste Problem/Frage hätte.

    Ich habe mir da jetzt einen Filtern zusammengestrickt.

    1. Auswahlfeld wähle Ich die column aus
    2. Auswahlfeld den Operator
    3. Auswahlfeld, den zu Filternden Wert

    Bei dem zu Filterndem Wert habe Ich nu auch das Problem.
    Es kann sein dass Ich entweder einen String oder etwas Numerisches filtern möchte. Wie kann Ich damit umgehen in bezug auf

    = ' String.text '
    = Numeric.text

    also wenn Ich mit unterschiedlichen Datentypen über ein und denselben filter gehen möchte.

    Oder muss man dafür erst über getshema den Datentyp auslesen und dann bei bedarf die ' ' einfügen ?
    "Mann" lernt mit seinen Projekten.
    ja, ohne Kenntnis des Datentyps kannst du keinen Filter programmieren, denn die Syntax unterscheidet zwischen Strings, DateTime und anderen.
    Aber den Datentyp erhälst du nicht per GetSchema, sondern mittm TypeOf-Operator.
    vlt bietet DataExpressions bereits die Lösung dieses Probs.
    Ich weiss nicht, ob Ich das jetzt so richtig verstanden habe, aber mit typeof und dem was in dem Link steht,
    wird doch überprüft was an daten gefiltert wird. Nicht was die zu filternde column für ein Typ ist.

    Somit würde Ich ein Problem bekommen, wenn der Name für ein Profil nicht rein als String zu erkennen ist, sondern zb 123 lautet.

    Wenn Ich mein DGV über ein Datatable befülle, haben dann die columns im DGV und im DT den gleichen Typ wie ind der DB ?
    "Mann" lernt mit seinen Projekten.

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

    kiter20 schrieb:

    Ich weiss nicht, ob Ich das jetzt so richtig verstanden habe, aber mit typeof und dem was in dem Link steht,
    wird doch überprüft was an daten gefiltert wird. Nicht was die zu filternde column für ein Typ ist.
    Richtig. Dass die im Filter angegebene Column den richtigen Datentyp hat, wird vorrausgesetzt.

    kiter20 schrieb:

    Somit würde Ich ein Problem bekommen, wenn der Name für ein Profil nicht rein als String zu erkennen ist, sondern zb 123 lautet.
    keine Ahnung, was du meinst. "123" ist ein String, und 123 ist ein Integer.
    Ist die Name-Property als String angelegt, so wirds mit 123 failen.

    kiter20 schrieb:

    Wenn Ich mein DGV über ein Datatable befülle, haben dann die columns im DGV und im DT den gleichen Typ wie ind der DB ?
    Halloo! Kapier mal: Das DGV wird nicht befüllt, es wird eine DataTable befüllt!
    Es kommt auf den Datentyp der DataColumn an, nicht auf die Columns im DGV!

    Tja, dassis eben das Problem: Verwarzte Datenbasis, keine Kenntnis, wies richtig ginge, und wg. der Verwarzung auch keine Möglichkeit, es richtig zu erlernen.
    Tja,
    dassis eben das Problem: Verwarzte Datenbasis, keine Kenntnis, wies
    richtig ginge, und wg. der Verwarzung auch keine Möglichkeit, es richtig
    zu erlernen.

    Aber ist das denn an dieser Stelle relevant?
    Halloo! Kapier mal: Das DGV wird nicht befüllt, es wird eine DataTable befüllt!
    Okay, der datatable wird mit daten aus der DB befüllt und bekommt der DGV als datasource
    den datatable. Besser? Trotz alle dem würde Ich es als mit Daten füllen bezeichnen. Das es erst den Weg über den datatable geht ist ja noch ne andere Sache.

    Mann könnte ja zb. auch direkt die Daten aus der DB in DGV schreiben, und dann hätte Ich das DGV befüllt.

    Natürlich binn Ich Änfänger, und Ich werde auch nie auf Dein/Euer level kommen. Möchte Ich auch nicht.(Möchten schon, aber dann binn Ich alt und grau)
    Mir geht es also nicht immer um die Perfekte lösung für meinen Speziellen Anwendungsfall, sonder um das Problem an sich.


    _________________________


    Also wird beim erstellen des datatables der Datentyp automatisch auf den der DB gesetzt.
    Und wenn Ich dann das DGV.datasource = DT mache, haben dann die Columns automatisch den gleichen Datentyp.

    ErfinderDesRades schrieb:

    keine Ahnung, was du meinst. "123" ist ein String, und 123 ist ein Integer.
    Ist die Name-Property als String angelegt, so wirds mit 123 failen.
    123 ist als String.

    ErfinderDesRades schrieb:

    Richtig. Dass die im Filter angegebene Column den richtigen Datentyp hat, wird vorrausgesetzt.

    Ich glaube da reden Wir jetzt aneinander vorbei.
    Ich muss ja erst einmal herausfinden, welchen datentyp die column hat, oder nicht.
    Denn der columnName, denn Ich in meiner Liste auswähle, verrät mir das noch nicht.
    Und die der Filterwert auch nicht. Denn Ich könnte ja 123 als String filtern wollen.

    Somit ist mein Gedankengang so, das ich mit dem Name der column mir diese Information beschaffen muss.
    Weshalb Ich ja wissen wollte, ob der datentyp automatisch überall Übertragen wird.

    Denn dann würde Ich doch diese Info aus dem datable oder dgv bekommen.(damit Ich die DB nicht öffnen muss)


    Hätte Ich denn dies Problem nicht, wenn Ich eine Ordentliche DB hätte und mir dort so einen Filter einbauen würde?
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Mann könnte ja zb. auch direkt die Daten aus der DB in DGV schreiben, und dann hätte Ich das DGV befüllt.
    Genau deswegen hühner ich auf diesem Unterschied so herum - wenn du das in einen Topf schmeißt, wirds Grütze werden ;)

    kiter20 schrieb:

    Somit ist mein Gedankengang so, das ich mit dem Name der column mir diese Information beschaffen muss.
    Weshalb Ich ja wissen wollte, ob der datentyp automatisch überall Übertragen wird.
    ja, und nu ist hofflich klar, dass du diese Info nicht aussm DGV bekommst, und auch nicht aus der DB, sondern aus der DataTable (so gott will).

    kiter20 schrieb:

    Hätte Ich denn dies Problem nicht, wenn Ich eine Ordentliche DB hätte und mir dort so einen Filter einbauen würde?
    naja, du hättest ein typisiertes Dataset, und da kann man sich drauf verlassen, dass die DataColumns ihren Datentyp richtig angeben.
    Bei dem was du hast, fürchte ich, dass alle DataColumns primitiverweise DataType.Object eingestellt haben, und eiglich erst dann ist dein Problem ein Problem.
    Du hast doch ein untypisiertes Dataset oder?
    Oder nur eine einzelne untypisierte DataTable?