Doppelte Namen in Combobox verhindern

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Toni_Edi.

    Doppelte Namen in Combobox verhindern

    Hallo,

    Wie kann ich verhindern das gleiche Name mehrfach in Combobox vorhanden.
    Die Daten kommen von Datagridview1

    Danke,

    VB.NET-Quellcode

    1. Dim row As DataRow = thedatatable.NewRow
    2. row(0) = ""
    3. thedatatable.Rows.InsertAt(row, 0)
    4. ComboBox2.DataSource = thedatatable
    5. ComboBox2.DisplayMember = "Name"
    6. ComboBox2.ValueMember = "name"
    7. ' End With
    Moin, Moin.

    Am besten eine neue Variable anlegen, die eine Liste (Collection, Array, etc.) aufnimmt, und diese dann "aussieben".

    Was auch immer aus Datagridview1 herauskommt, zuweisen in die neue Variable, (- List(Of String) - zum Beispiel).

    Wenn eine List(Of Typ) dann "gefilterteListe.DistinctBy(Function(x) x.EindeutigkeitsDingSie).ToList".

    docs.microsoft.com/de-de/dotne…e/queries/distinct-clause

    Ist zwar LINQ... (Ich bin eh linkshänder, also was solls ;) ).

    Es gibt natürlich auch andere Varianten.

    Bei 'For Each' Schleifen, einfach alle durchlaufen und mit 'IF' schauen ob Wert schon in neuer Auflistung, dann anfügen, sonst aussetzen...

    Ich nutze keine DGV mehr, aber ich glaube es ist sogar möglich mit LINQ direkt die Combobox, mittels Binding, gefiltert (Doublettenfrei) zu Bestücken.

    Ich muss hier klipp und klar sagen, ohne Anwalt 'sach' ich nix mehr... :)

    c.u. Joshi aus HH 8|

    Toni_Edi schrieb:

    Die Daten kommen von Datagridview1
    Das ist ja eigentümlich. Weil die Codezeilen, die du zeigst, da kommen Daten aus einer DataTable.



    DistinctBy ist eine Extension, die's soweit ich weiss bei Linq noch nicht gibt. Die hab ich mal erfunden, aber dazu muss man meine Helpers einbinden.

    Die geht so:

    VB.NET-Quellcode

    1. <Extension()>
    2. Public Function DistinctBy(Of T, TProp As IEquatable(Of TProp))(items As IEnumerable(Of T), selector As Func(Of T, TProp)) As IEnumerable(Of T)
    3. Return items.GroupBy(selector).Select(Function(grp) grp.First)
    4. End Function

    Damit wäre sowas denkbar:

    VB.NET-Quellcode

    1. Dim distinctRows = thedatatable.Rows.Cast(Of DataRow).DistinctBy(Function(rw) CStr(rw("Name")))
    2. ComboBox2.DataSource = distinctRows.ToList

    Naja, eigentlich kann man das DistinctBy auch direkt integrieren:

    VB.NET-Quellcode

    1. Dim distinctRows = thedatatable.Rows.Cast(Of DataRow).GroupBy(Function(rw) CStr(rw("Name"))).Select(Function(grp) grp.First)
    2. ComboBox2.DataSource = distinctRows.ToList
    (glaubich, ungetestet)

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

    Toni_Edi schrieb:

    2. beispiel: "DistinctBy" ist kein Member von System
    ja, das sagte ich ja bereits - (und dass ich deshalb DistinctBy selbst habe erfinden müssen).

    Toni_Edi schrieb:

    3. beispiel: Bombobox2 " System.Data.DataRow"
    Hä? Willst du damit etwas sagen, und wenn ja, was?

    Toni_Edi schrieb:

    System.Data.DataRow
    System.Data.DataRow
    Dito
    Fehlermeldungen immer wortwörtlich zitieren, sonst wird's im dümmsten Fall Spekulatiusbacken. Post#3 bitte vollständig lesen! Du musst die Extension selber in Deinen Code einbauen. Den einzubauenden Code hat EdR dort bereits geschrieben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist mein Code.
    So funktioniert alles asser Distinct.
    Danke,

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. DataGridView1.Columns.Clear()
    3. DataGridView1.DataSource = Nothing
    4. DataGridView1.Rows.Clear()
    5. thedatatable.Rows.Clear()
    6. thedatatable.Clear()
    7. thedatatable2.Rows.Clear()
    8. thedatatable2.Clear()
    9. ComboBox1.DataSource = Nothing
    10. ComboBox2.DataSource = Nothing
    11. Me.ComboBox1.Items.Clear()
    12. Me.ComboBox2.Items.Clear()
    13. Label3.Text = ""
    14. Label4.Text = ""
    15. Label5.Text = ""
    16. Dim xName As String = ComboBox1.Text
    17. 'StartDate.Format = DateTimePickerFormat.Custom
    18. 'StartDate.CustomFormat = "dd.MM.yyyy HH:mm:ss"
    19. Dim fromDate As DateTime = StartDate.Value.Date + StartTime.Value.TimeOfDay
    20. 'EndDate.Format = DateTimePickerFormat.Custom
    21. 'EndDate.CustomFormat = "dd.MM.yyyy HH:mm:ss"
    22. Dim toDate As DateTime = EndDate.Value.Date + EndTime.Value.TimeOfDay
    23. If CheckBox1.CheckState = 1 Then
    24. 'Query auslösen
    25. Dim results = (From line In File.ReadAllLines(TextBox1.Text).Skip(1) _
    26. Let fields = line.Split(New Char() {";"c}).AsEnumerable() _
    27. Where DateTime.Parse(fields.ElementAt(1)) >= fromDate AndAlso _
    28. DateTime.Parse(fields.ElementAt(1)) <= toDate AndAlso _
    29. fields.ElementAt(0) = xName Select fields).ToArray()
    30. For Each element In results
    31. Dim NewRow As DataRow = thedatatable.NewRow
    32. Dim NewRow2 As DataRow = thedatatable2.NewRow
    33. NewRow2("Name2") = element(0)
    34. NewRow("Name") = element(0)
    35. NewRow("Date") = element(1)
    36. NewRow("Time") = element(2)
    37. NewRow("True/False") = element(8)
    38. NewRow("Eb1") = element(4)
    39. NewRow("Wil") = element(5)
    40. NewRow("Eb2") = element(6)
    41. NewRow("Wi2") = element(7)
    42. NewRow("Stat") = element(9)
    43. NewRow("Wi_s") = element(3)
    44. thedatatable.Rows.Add(NewRow)
    45. thedatatable2.Rows.Add(NewRow2)
    46. Next
    47. DataGridView1.DataSource = thedatatable2
    48. ComboBox2.DisplayMember = "Name"
    49. ComboBox2.ValueMember = "Name"
    1. ist der Code nicht vollständig (For Each ohne Next? Kein End Sub?)
    2. Was erwartest Du? Dass wir Dir Deinen Code jetzt so umbauen, dass Du ihn nur noch in Dein Programm einfügen musst? Oder anders ausgedrückt: Was sollen wir mit Deinem Teilcode und was ist Deine Frage/Erwartung an uns?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    1. ist der Code nicht vollständig (For Each ohne Next? Kein End Sub?)
    2. Was erwartest Du? Dass wir Dir Deinen Code jetzt so umbauen, dass Du ihn nur noch in Dein Programm einfügen musst? Oder anders ausgedrückt: Was sollen wir mit Deinem Teilcode und was ist Deine Frage/Erwartung an uns?

    Next ist und End Sub ist da.

    Sorry ich habe das nicht mit kopiert.

    Es funktioniert alles außer Doppel Namen.
    Ich habe mein Code gepostet, damit Ihr seht, woher die Daten kommen.

    Es gibt auch gute Freunde hier, die werden mir helfen.



    Ich bitte Euch, wenn Ihr mir nicht helfen wollen, dann lass es sein.

    Lieber antwortet Ihr nicht.
    Vielen Dank für die Unterstützung!

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

    Hmm - also sowas funktioniert nicht?

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. DataGridView1.Columns.Clear()
    3. DataGridView1.DataSource = Nothing
    4. DataGridView1.Rows.Clear()
    5. thedatatable.Rows.Clear()
    6. thedatatable.Clear()
    7. thedatatable2.Rows.Clear()
    8. thedatatable2.Clear()
    9. ComboBox1.DataSource = Nothing
    10. ComboBox2.DataSource = Nothing
    11. Me.ComboBox1.Items.Clear()
    12. Me.ComboBox2.Items.Clear()
    13. Label3.Text = ""
    14. Label4.Text = ""
    15. Label5.Text = ""
    16. Dim xName As String = ComboBox1.Text
    17. 'StartDate.Format = DateTimePickerFormat.Custom
    18. 'StartDate.CustomFormat = "dd.MM.yyyy HH:mm:ss"
    19. Dim fromDate As DateTime = StartDate.Value.Date + StartTime.Value.TimeOfDay
    20. 'EndDate.Format = DateTimePickerFormat.Custom
    21. 'EndDate.CustomFormat = "dd.MM.yyyy HH:mm:ss"
    22. Dim toDate As DateTime = EndDate.Value.Date + EndTime.Value.TimeOfDay
    23. If CheckBox1.CheckState = 1 Then
    24. 'Query auslösen
    25. Dim results = (From line In File.ReadAllLines(TextBox1.Text).Skip(1) _
    26. Let fields = line.Split(New Char() {";"c}).AsEnumerable() _
    27. Where DateTime.Parse(fields.ElementAt(1)) >= fromDate AndAlso _
    28. DateTime.Parse(fields.ElementAt(1)) <= toDate AndAlso _
    29. fields.ElementAt(0) = xName Select fields).ToArray()
    30. For Each element In results
    31. Dim NewRow As DataRow = thedatatable.NewRow
    32. Dim NewRow2 As DataRow = thedatatable2.NewRow
    33. NewRow2("Name2") = element(0)
    34. NewRow("Name") = element(0)
    35. NewRow("Date") = element(1)
    36. NewRow("Time") = element(2)
    37. NewRow("True/False") = element(8)
    38. NewRow("Eb1") = element(4)
    39. NewRow("Wil") = element(5)
    40. NewRow("Eb2") = element(6)
    41. NewRow("Wi2") = element(7)
    42. NewRow("Stat") = element(9)
    43. NewRow("Wi_s") = element(3)
    44. thedatatable.Rows.Add(NewRow)
    45. thedatatable2.Rows.Add(NewRow2)
    46. Next
    47. DataGridView1.DataSource = thedatatable2
    48. ComboBox2.DisplayMember = "Name"
    49. ComboBox2.ValueMember = "Name"
    50. Dim distinctRows = thedatatable.Rows.Cast(Of DataRow).GroupBy(Function(rw) CStr(rw("Name"))).Select(Function(grp) grp.First)
    51. ComboBox2.DataSource = distinctRows.ToList
    Ich hätte gedacht das löst das Problem.

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

    Hi.

    Nach schneller Durchsicht, ist mir aufgefallen, das in deiner Schleife nicht mit einer Bedingung (IF-Statement) das Vorhandensein geprüft wird.

    Ich nehme an das in NewRow und NewRow2 das selbe steht, daher sollte nur eine "Row" als Resultat entstehen.

    Prüfe bitte ob in der NewRow (NowRow2 lasse ich weg) die "Name" schon den Wert von "element(0)" enthält.


    Also wenn "thedatatable" schon den Name enthält, dann nichts machen ansonsten "adden". - "thedatatable.Rows.Add(NewRow)" -


    Das muss über alle Element in der "thedatatable" und auch in der "DataGridView1" geschehen, und erst wenn es nicht vorhanden ist "Anfügen", sonst weglassen.

    Das mit ".distinct" ist danach nicht zwingend Notwendig.

    Es wurde ja in der Schleife geprüft ob der Name vorhanden ist.

    Ich empfehle dir eine einfachere Strategie.

    Hole dir die Datensätze aus der Texdatei und lege sie in Variablen ab (ist ja schon bei dir vorhanden).
    Hole dir zusätzlich die Datensätze in der DatagridView, und nutzte gleich eine Filterung auf "Name", und lege dir diese als einfache Liste ab.
    Da du ein Array genutzt hast, kann das auch so weiter genutzt werden, aber List(Of String) währe eher zu empfehlen.

    Dann mittels Schleife über die Datensätze der DGV (gefilterte Daten), und gucken ob in den Textdatei-Datensätzen der Name nicht vorhanden bzw. vorhanden ist.
    Das wird mittels "Schleife in Schleife" gelöst.

    Hoffe das war etwas Aufklärend und nicht Verwirrend. (Hmmm. Klingt wie damals in der Pubertät... :) )

    c.u. Joshi aus HH
    komisch. Das bedeutet, dass die DataRows keine Spalte "Name" haben. Was ja nicht sein kann, dann hättest du schon beim Befüllen einen Fehler.
    Ah - Probierma die Reihenfolge andersrum:

    VB.NET-Quellcode

    1. Dim distinctRows = thedatatable.Rows.Cast(Of DataRow).GroupBy(Function(rw) CStr(rw("Name"))).Select(Function(grp) grp.First)
    2. ComboBox2.DataSource = distinctRows.ToList
    3. ComboBox2.DisplayMember = "Name"
    4. ComboBox2.ValueMember = "Name"
    Aber gut, dass du erklärst, wie sich die Fehlfunktion auswirkt - dann kann man zumindest versuchen zu helfen.
    Bei nur "funktioniert nicht" hat man keine Chance.

    ErfinderDesRades schrieb:

    Ah - Probierma die Reihenfolge andersrum:

    Es ist ein Fehler aufgetreten.

    "An den neuen Anzeigemember kann nicht gebunden werden.
    Parametername: newDisplayMember"

    Ich habe das so gelöst:

    VB.NET-Quellcode

    1. DataGridView1.DataSource = thedatatable
    2. Dim row As DataRow = thedatatable.NewRow
    3. row.Item("Name") = "ALLE"
    4. thedatatable.Rows.InsertAt(row, 0)
    5. Dim names As List(Of String) = thedatatable.AsEnumerable() _
    6. .Select(Function(r) r.Field(Of String)("Name")) _
    7. .Distinct() _
    8. .ToList()
    9. ComboBox2.DataSource = names


    Trotzedem vielen Dank

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „EaranMaleasi“ ()