Gebundene Combobox in Datagridview vorselektieren

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

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

    Gebundene Combobox in Datagridview vorselektieren

    Hallo zusammen.

    Ich komme einfach nicht weiter.

    Hier im Forum gibt es einen ähnlichen Beitrag mit dem Titel "Combobox in Datagridview Wert vorselektieren". Aber dieser Ansatz scheint bei einer gebundenen ComboBox nicht zu funktionieren.

    Ich versuche mal mein Problem zu formulieren:

    Ich habe ein ungebundenes DataGridView und darin als 1. Spalte eine gebundene ComboBox und 2 weitere ungebundene Standardspalten.

    Das manuelle Füllen, Auswählen und Abrufen der Werte funktioniert wunderbar.

    Die ComboBox binde ich wie folgt:

    VB.NET-Quellcode

    1. Dim dgvCol As DataGridViewComboBoxColumn
    2. dgvCol = dgv.Columns("colAnrede")
    3. dgvCol.DataSource = dvAnreden
    4. dgvCol.DisplayMember = "Wert"
    5. dgvCol.ValueMember = "Uid"


    Wenn ich einen neuen Eintrag (Row) im DataGridView erstelle, mache ich das mit

    VB.NET-Quellcode

    1. dgv.Rows.Add(Nothing, "", "")
    und kann dann die Anrede aus der ComboBox auswählen und die beiden anderen Spalten beliebig füllen.

    Jetzt bin ich an einem Punkt, wo ich das DataGridView wieder mit einigen zuvor gesammelten Werten befüllen möchte.

    Ich kann die beiden Standardspalten ohne Probleme setzen und damit weiterarbeiten. Aber die ComboBox in der ersten Spalte bringt mich zum verzweiflen!

    Ich bekomm fast immer die Fehlermeldung mit einer DataGridView-Ausnahme, oder es steht kein Wert in der ComboBox.

    Könnt Ihr mir sagen, wie ich diese vorab selektieren kann?

    Vorab Danke für eure Hilfe und viele Grüße, Michl
    Also:
    Im DataView dvAnrede sind aktuell 4 Uid's und 4 Werte. Diese Werte werden auch in der ComboBox zur Auswahl gestellt.
    Ich speichere die Ergebnisse (auch Uid und Wert der ComboBox) aus dem dgv (+ einige andere Werte) in einer anderen DataTable.
    Aus diesen teporär gespeicherten Daten möchte ich die Rows (inkl. ComboBox) wieder füllen/herstellen.

    Die Uid's die ich in der ComboBox setzen möchte sind im meiner temporären Tabelle vorhanden.

    Ich hoffe, dass ich dich nicht nochmals falsch verstanden habe, und das deine Frage beantwortet.
    Irgendwelche Daten dürften trotzdem nicht übereinstimmen...
    Du speicherst die Daten eines ungebundenen DGV's in eine Tabelle und später wieder retour?
    Wieso bindest du dad DGV nicht gleich über e8ne BS an die Tabelle? Dann ersparst du dir das ganze hin und her...
    Hallo VB1963,

    es gibt keinen besonderen Grund warum das dgv nicht per BS gebunden habe, außer dass mit den DataTables später hinzugekommen ist und ich das ganze nicht nochmal umbauen wollte. Weiterhin fehlt mir hier noch einiges an Erfahrung.

    ich hab mal auf die schnelle ein kleines Beispiel meines Problems zusammengestellt. wo ich mir eigentlich sicher bin, dass ich die Uids richtig habe.
    Mir fehlt ja nur die Vorselektierung der ComboBox.

    Vielleicht kannst du mir trotzden sagen wie ich das mache, dass die ComboBox Vorselektiert ist.

    VB.NET-Quellcode

    1. Dim dtAnrede As New DataTable
    2. dtAnrede.Columns.Add("Uid", System.Type.GetType("System.UInt64"))
    3. dtAnrede.Columns.Add("Anrede", System.Type.GetType("System.String"))
    4. Dim myNewRow As DataRow
    5. myNewRow = dtAnrede.NewRow()
    6. myNewRow("Uid") = 1
    7. myNewRow("Anrede") = "Dr."
    8. dtAnrede.Rows.Add(myNewRow)
    9. myNewRow = dtAnrede.NewRow()
    10. myNewRow("Uid") = 2
    11. myNewRow("Anrede") = "Fa."
    12. dtAnrede.Rows.Add(myNewRow)
    13. myNewRow = dtAnrede.NewRow()
    14. myNewRow("Uid") = 3
    15. myNewRow("Anrede") = "Frau"
    16. dtAnrede.Rows.Add(myNewRow)
    17. myNewRow = dtAnrede.NewRow()
    18. myNewRow("Uid") = 4
    19. myNewRow("Anrede") = "Herr"
    20. dtAnrede.Rows.Add(myNewRow)
    21. Dim dvAnrede As DataView = New DataView(dtAnrede)
    22. 'combobox "Anrede" füllen
    23. Dim dgvCol As DataGridViewComboBoxColumn
    24. dgvCol = dgv.Columns("colAnrede")
    25. dgvCol.DataSource = dvAnrede
    26. dgvCol.ValueMember = "Uid"
    27. dgvCol.DisplayMember = "Anrede"
    28. 'So, die ComboBox ist jetzt gefüllt
    29. Dim dtTempData As New DataTable
    30. dtTempData.Columns.Add("Uid", System.Type.GetType("System.UInt64"))
    31. dtTempData.Columns.Add("ArUid", System.Type.GetType("System.UInt64"))
    32. dtTempData.Columns.Add("ArBez", System.Type.GetType("System.String"))
    33. dtTempData.Columns.Add("HwNr", System.Type.GetType("System.String"))
    34. dtTempData.Columns.Add("Intern", System.Type.GetType("System.String"))
    35. Dim myTempRow As DataRow
    36. myTempRow = dtTempData.NewRow()
    37. myTempRow("Uid") = 1
    38. myTempRow("ArUid") = 2
    39. myTempRow("ArBez") = "Fa."
    40. myTempRow("HwNr") = "0815"
    41. myTempRow("Intern") = "Vermerk1"
    42. dtTempData.Rows.Add(myTempRow)
    43. myTempRow = dtTempData.NewRow()
    44. myTempRow("Uid") = 2
    45. myTempRow("ArUid") = 4
    46. myTempRow("ArBez") = "Herr"
    47. myTempRow("HwNr") = "4711"
    48. myTempRow("Intern") = "Vermerk5"
    49. dtTempData.Rows.Add(myTempRow)
    50. Dim dvTempData As DataView = New DataView(dtTempData)
    51. For i = 0 To dvTempData.Count - 1
    52. Dim tmpArUid As Integer = dvTempData(i).Item("ArUid")
    53. Dim tmpArBez As String = dvTempData(i).Item("ArBez")
    54. Dim tmpHwNr As String = dvTempData(i).Item("HwNr")
    55. Dim tmpIntern As String = dvTempData(i).Item("Intern")
    56. dgv.Rows.Add(Nothing, tmpHwNr, tmpIntern) 'Wenn ich hier NOTHING durch "tmpArUid" oder "tmpArBez" ersetze kommt eine Fehlermeldung
    57. 'dgv.Rows(i).Cells("colAnrede").Value = tmpArBez 'Wenn ich hier VALUE durch "tmpArUid" oder "tmpArBez" ersetze kommt eine Fehlermeldung
    58. Next
    OK, ich hätte diesen Code vielleicht nicht als Beispiel, sondern als Code-Schnipsel deklarieren sollen. Sorry dafür.

    VB1963 schrieb:

    Irgendwelche Daten dürften trotzdem nicht übereinstimmen...
    Ich habe mit dem obigen Code nur darstellen wollen, das die Uid's in beiden Tabellen übereinstimmen und ich es trotzdem nicht hinbekomme.

    Wenn ihr für das Problem eine Solution braucht, werde ich mich an die Arbeit machen und eine kleine erstellen um es besser darzustellen.

    PS. wird aber bis zum nächsten WE dauern, da ich unter der Woche keine Zeit habe.

    Trotzdem mal Danke für eure Mühe.
    Hallo VB1963 und ErfinderDesRades,

    Ich hab doch noch die Zeit gefunden und mal ein kleines Beispielprojekt erstellt, um mein Problem besser zu erläutern.

    Ich hoffe, dass dieses Beispiel ausreicht und danke euch vorab nochmals für eure Hilfe.

    Wenn ich die Daten lade, sollen die gespeicherten Anreden in der ComboBox angezeigt werden, und das krieg ich einfach nich hin :(

    Gruß, Michl
    Dateien
    @Michl Hast Du so viele Anreden, dass Du dafür den Typ UInt64 vergeben musst?
    Mach da Int32 draus und los.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub cmdLoadData_Click(sender As Object, e As EventArgs) Handles cmdLoadData.Click
    2. For i = 0 To dvTempData.Count - 1
    3. Dim tmpArUid As Integer = dvTempData(i).Item("ArUid")
    4. Dim tmpArBez As String = dvTempData(i).Item("ArBez")
    5. Dim tmpHwName As String = dvTempData(i).Item("HwName")
    6. Dim tmpHwNr As String = dvTempData(i).Item("HwNr")
    7. Dim tmpIntern As String = dvTempData(i).Item("Intern")
    8. dgv.Rows.Add(tmpArUid, tmpHwName, tmpHwNr, tmpIntern) ' dies
    9. Next
    10. End Sub
    11. Private Sub CreateColsInDataTable()
    12. 'Tabelle Anreden
    13. dtAnrede.Columns.Add("Uid", System.Type.GetType("System.Int32")) ' dies
    14. dtAnrede.Columns.Add("Anrede", System.Type.GetType("System.String"))
    15. 'Tabelle TempData
    16. dtTempData.Columns.Add("Uid", System.Type.GetType("System.UInt64"))
    17. dtTempData.Columns.Add("ArUid", System.Type.GetType("System.UInt64"))
    18. dtTempData.Columns.Add("ArBez", System.Type.GetType("System.String"))
    19. dtTempData.Columns.Add("HwName", System.Type.GetType("System.String"))
    20. dtTempData.Columns.Add("HwNr", System.Type.GetType("System.String"))
    21. dtTempData.Columns.Add("Intern", System.Type.GetType("System.String"))
    22. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    (Ähm - das löst sein Prob aber auch nicht)

    Hat imo insgesamt so kein Wert.
    Lass die Faxen mit Columns zufügen und Kram, und fang an mit typisiertem Dataset, und standardmäßigem Databinding.
    gugge "JoiningView" auf vier Views-Videos, das ist genau der Anwendungsfall.

    Habs jetzt auch mal umgesetzt, mit Option Strict On, und auch leistungsoptimiertes Laden/Speichern von Platte.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports ComoBoxVorselektieren.HandwerkerDts
    3. Imports System.IO
    4. Public Class Form2
    5. Private _DataFile As New FileInfo("..\..\Handwerker.xml")
    6. Private Sub cmdClose_Click(sender As Object, e As EventArgs) Handles cmdClose.Click
    7. Me.Close()
    8. End Sub
    9. Private Sub cmdLoadData_Click(sender As Object, e As EventArgs) Handles btGenerateData.Click
    10. With HandwerkerDts
    11. .Clear()
    12. For Each ar In "Dr. Fa. Frau Herr".Split
    13. .Anrede.AddAnredeRow(ar)
    14. Next
    15. .Handwerker.AddHandwerkerRow(.Anrede(0), "FremdeFirma", "0815", "Vermerk1")
    16. .Handwerker.AddHandwerkerRow(.Anrede(3), "Mustermann", "4711", "Vermerk5")
    17. End With
    18. End Sub
    19. Protected Overrides Sub OnClosed(e As EventArgs)
    20. While Me.Controls.Count > 0 : Me.Controls(Me.Controls.Count - 1).Dispose() : End While
    21. MyBase.OnClosed(e)
    22. End Sub
    23. Private Sub btLoad_Click(sender As Object, e As EventArgs) Handles btLoad.Click
    24. For Each bs In {HandwerkerBindingSource} ' alle BindingSources (ist zZt nur eine) deaktivieren
    25. bs.RaiseListChangedEvents = False
    26. Next
    27. For Each tb As DataTable In HandwerkerDts.Tables ' alle DataTables deaktivieren
    28. tb.BeginLoadData()
    29. Next
    30. HandwerkerDts.Clear()
    31. HandwerkerDts.ReadXml(_DataFile.FullName)
    32. For Each tb As DataTable In HandwerkerDts.Tables
    33. tb.EndLoadData()
    34. Next
    35. HandwerkerDts.EnforceConstraints = True 'Constraints reaktivieren
    36. For Each bs In {HandwerkerBindingSource}
    37. bs.RaiseListChangedEvents = True
    38. bs.ResetBindings(False)
    39. Next
    40. End Sub
    41. Private Sub btSave_Click(sender As Object, e As EventArgs) Handles btSave.Click
    42. HandwerkerDts.WriteXml(_DataFile.FullName)
    43. System.Media.SystemSounds.Asterisk.Play()
    44. End Sub
    45. End Class
    Dateien

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