Problem mit Array und Combobox

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Agent.

    Problem mit Array und Combobox

    Hallo Zusammen.

    Ich beschäftige mich erst seit kurzem mit VB und habe mit folgender Aufgabenstellung meine Probleme.
    Habe auch schon viele Beispiele angeschaut und probiert, aber ich fürchte, ich seh den Wald vor lauter Bäumen nicht.

    Aufgabe:
    1. Schritt
    Aus einem Objekt (COM) sollen Datensätze in ein Array ausgelesen werden. Abgefragt werden Datensätze, die aus 3 Werten bestehen. ZB. ein Datensatz besteht aus zB. 4116 (ID), Audi A4 (Name), 1 (Typ)
    Das Objekt gibt die IDs aller verfügbaren Elemente zurück, mit den IDs kann man sich dann den zugehörigen Typ und den Namen holen.
    2. Schritt
    Der Name bestimmter Werte (alle vom Typ 1) des Arrays soll in einer Combobox zur Auswahl stehen
    3. Schritt
    Die zum ausgewählten Text passende ID soll an eine Variable übergeben werden.

    Probleme:
    1.
    Vom Array weiß ich nur eine Dimension, nämlich, daß es 3 Werte pro "Element" sind. Nicht aber die Anzahl der Elemente. Ich kann die Anzahl schätzen und dann festlegen. Nicht elegant.
    Aber wenn ich die Dimensionierung offen lasse, bekomme ich beim Debuggen eine Fehlermeldung.
    2.
    Ich schaffe es nicht, der ComboBox zum Namen auch die ID mitzugeben.
    Der Name taucht zwar in der Liste auf, ich brauche aber zur Weiterverarbeitung die zugehörige ID.

    So sieht der Code momentan aus ...

    VB.NET-Quellcode

    1. ' 50 ist die geschätzte Anzahl von Datensätzen, Vorlagen(,) bringt beim Debuggen ne Fehlermeldung
    2. ' und Vorlagen(,2) nimmt er nicht
    3. Public Vorlagen(50, 2)
    4. Public ID As Integer
    5. ...
    6. 'Werte auslesen und in Array schreiben
    7. Dim i As Integer = 0
    8. For Each ID As Integer In COM.GetIDs()
    9. Vorlagen(i, 0) = ID
    10. Vorlagen(i, 1) = COM.GetName(ID)
    11. Vorlagen(i, 2) = COM.GetType(ID)
    12. i = i + 1
    13. Next
    14. i = i - 1
    15. 'Verteilen der Elemente des Arrays in 3 ComboBoxen
    16. While i >= 0
    17. If Vorlagen(i, 2) = 1 Then
    18. TypEinsComboBox.Items.Add(Vorlagen(i, 1))
    19. ' Wie weise ich die ID dem Namen zu???
    20. ElseIf Vorlagen(i, 2) = 2 Then
    21. TypZweiComboBox.Items.Add(Vorlagen(i, 1))
    22. ElseIf Vorlagen(i, 2) = 6 Then
    23. TypSechsComboBox.Items.Add(Vorlagen(i, 1))
    24. End If
    25. i = i - 1
    26. End While
    27. ' Anschliessend noch die ID zum ausgewählten Namen in der ComboBox an eine Variable übergeben
    28. ' Das sollte ich hinkriegen ;)


    Würd mich freuen, wenn ihr mir weiterhelfen könnt.

    Danke und Grüße.
    Hallo TobiKubi.

    Danke für die Antwort.

    Für Redim musste ich die "Länge" des Arrays an die hintere Stelle nehmen. "Vorlagen(2,i)"
    Anscheinend kann VB nur da redimmen.
    Dadurch sind die 3 Werte der Datensätze in der Tooltip-Anzeige des Arrays nicht mehr hintereinander.
    Jetzt kommen zuerst alle IDs, dann die Namen, dann die Typen.
    Nicht so übersichtlich, aber von der Funktion passts.
    Das Problem mit dem Array ist gelöst.
    hallo tobikubi,

    da da datensätze bei verloren gehen können und meistens werden!

    korrigere mich wenn ich falsch liege - aber
    mit redim können die daten nicht verloren gehen, sie werden ganz sicher weg sein. ;(

    gruss

    mikeb69
    Die Schleife sieht jetzt so aus (und funktioniert) ...

    VB.NET-Quellcode

    1. For Each VorlagenID As Integer In COM.GetIDs()
    2. ReDim Preserve Vorlagen(2, i)
    3. Vorlagen(0, i) = VorlagenID
    4. Vorlagen(1, i) = COM.GetName(VorlagenID)
    5. Vorlagen(2, i) = COM.GetType(VorlagenID)
    6. i = i + 1
    7. Next



    Jemand ne Idee zum ID in ComboBox Problem?
    ich bin mir nicht sicher ob dies immer funktioniert. so vielleicht besser(wobie ich nicht weiss, ob com.getids die einzelnen werte zurückgibt oder einen count!:

    VB.NET-Quellcode

    1. ReDim Preserve Vorlagen(COM.GetIDs(), 2)
    2. For Each VorlagenID As Integer = 0 In COM.GetIDs()
    3. Vorlagen(i, 0) = VorlagenID
    4. Vorlagen(i 1) = COM.GetName(VorlagenID)
    5. Vorlagen(i, 2) = COM.GetType(VorlagenID)
    6. i = i + 1
    7. Next

    VB.NET-Quellcode

    1. Variablen deklaration
    2. Public ID()As String
    3. Public Get_Name() As String
    4. Public Get_TyPe() As String
    5. Public ID As Integer
    6. Public ArrayUbound_ID As Long 'gröste Index in Array
    7. Public ArrayLbound_ID As Long 'kleinste Index in Array
    8. Public ArrayLbound_GetName As Long 'kleinste Index in Array
    9. Public ArrayUbound_GetName As Long 'kleinste Index in Array
    10. Public ArrayUbound_GetType As Long
    11. Public ArrayLbound_GetType As Long
    12. Public z1 As Long
    13. Public z2 As Long
    14. Public z3 As Long
    15. ...
    16. 'Werte auslesen und in Array schreiben
    17. Dim i As Integer = 0
    18. For Each ID In COM.GetIDs()
    19. Redim Preserve ID (i)
    20. Redim Preserve Get_Name(i)
    21. Redim Preserve Get_Type(i)
    22. ID(i)=ID
    23. Get_Name(i) = COM.GetName(ID)
    24. Get_Type(i) = COM.GetType(ID)
    25. i = i + 1
    26. Next
    27. 'Kleinste und gröste Index in Array ermitteln
    28. ArrayUbound_ID = Ubound(ID)
    29. ArrayLbound_ID = Lbound(ID)
    30. ArrayUbound_GetName = Ubound(Get_Name)
    31. ArrayLbound_GetName = Lbound(Get_Name)
    32. ArrayUbound_GetType = Ubound(Get_Type)
    33. ArrayLbound_GetType = Lbound(Get_Type)
    34. 'Wenn der Anzal die Datenfelder in allen Arrays gleich sind,
    35. '(ArrayUbound_ID =ArrayUbound_GetName=ArrayUbound_GetType)
    36. 'dann kannst du das mit eine Schleife alle Einträge aus Array
    37. 'in deine ComoboBox übernemen
    38. For z1 = ArrayLbound_ID to ArrayUbound_ID
    39. ComboBox1.Items.Add (ID(z1)
    40. ComboBox2.Items.Add (Get_Name(z1))
    41. ComboBox3.Items.Add (Get_Type(z1))
    42. Next
    43. 'Wenn der Anzahl die Datenfelder in Array nicht gleich gros
    44. 'dann muß du für jeden Array eine separate Schleife verwenden
    45. For z1 = ArrayLbound_ID to ArrayUbound_ID
    46. ComboBox1.Items.Add (ID(z1))
    47. Netx
    48. 'und das gleiche schreibst du für Get_Name und GetType
    49. ' Anschliessend noch die ID zum ausgewählten Namen in der ComboBox an eine Variable übergeben
    50. ' Das sollte ich hinkriegen


    Ich weis zwar nicht welche Werte werden von ID , GetName und GetType zurück gegeben, aber so muß funktionieren !

    Mfg Alex
    Hallo Alex.

    Mein Problem lag woanders.

    ID, Name und Type bilden quasi ein Element.
    Anhand des Types (Wert 1,2 oder 6) soll entschieden werden, in welche ComboBox das Element sortiert wird.
    Dabei soll der Benutzer in der ComboBox den Namen sehen. Nach der Auswahl soll aber programmintern die zugehörige ID weiterverarbeitet werden.

    Soweit ich das verstanden habe, bietet die ComboBox auch die Möglichkeit, sowohl Namen als auch einen dazugehörigen Wert abzulegen.
    Ich bekomme zwar den Namen als Eintrag in die ComboBox, nicht aber die ID dazu.
    Ich weis nicht wocher hast du ID hast aber du kannst selber das ID vergeben.
    Ok das Problem scheint mir doch bischen unverständlich, ich meine damit was soll der Benutzer mit die Drei ComboBoxen machen ?

    Die Werte in Array schreiben und danach in ComboBox Werte aus Array eintragen hast du bereits die Code, du muß sie nur richtig umsetzen können.


    Mfg Alex
    Ich machs mal anschaulich.

    Über das COM Objekt bekomme ich Datensätze.
    Zuerst die verfügbaren IDs. Damit kann ich mir dann zugehörigen Typ und Namen holen.
    Im Endeffekt hab ich dann folgendes Array.

    ID Name Typ
    4000 Audi A4 1
    4001 Ford Galaxy 2
    4123 Golf 6
    4204 Ford Focus 2
    4205 Audi A6 1
    4311 Lupo 6
    4333 VW Polo 6
    ...

    Alle VWs sollen in eine Combo, alle Audis in eine und alle Ford in eine, ich trenne also nach Typ.

    Typ1
    ComboBox1
    Audi A4 (4000)
    Audi A6 (4205)

    Typ2
    ComboBox2
    Ford Galaxy (4001)
    Ford Focus (4204)

    Typ6
    ComboBox3
    Golf (4123)
    Lupo (4311)
    VW Polo (4333)

    Der Benutzer soll in der Combobox nicht die IDs in Klammern, sondern nur die Namen sehen. Für die Weiterverarbeitung der vom Benutzer getroffenen Auswahl brauche ich aber die ID.

    Dabei kann es vorkommen, daß zwei Namen identisch sind, aber unterschiedliche IDs haben.
    Ich kann also nicht zuverlässig mit dem ausgewählten Namen das Array abfragen.

    Mit ComboBox1.Items.Add bekomm ich die Namen in die ComboBox.
    Wie leg ich die dazugehörigen IDs in der ComboBox ab?

    (Zumindest habe ich das so verstanden, daß die ComboBox die Möglcihkeit bieten, zu einem Namen auch einen zweiten Wert abzulegen)

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

    Die Code habe ich geändert nach deine Wünsche, schau genau hin !

    VB.NET-Quellcode

    1. Variablen deklaration
    2. Public ID()As String
    3. Public Get_Name() As String
    4. Public Get_TyPe() As String
    5. Public ID As Integer
    6. Public ArrayUbound_ID As Long 'gröste Index in Array
    7. Public ArrayLbound_ID As Long 'kleinste Index in Array
    8. Public ArrayLbound_GetName As Long 'kleinste Index in Array
    9. Public ArrayUbound_GetName As Long 'kleinste Index in Array
    10. Public ArrayUbound_GetType As Long
    11. Public ArrayLbound_GetType As Long
    12. Public z1 As Long
    13. Public z2 As Long
    14. Public z3 As Long
    15. ...
    16. 'Werte auslesen und in Array schreiben
    17. Dim i As Integer = 0
    18. For Each ID In COM.GetIDs()
    19. ReDim Preserve ID (i)
    20. ReDim Preserve Get_Name(i)
    21. ReDim Preserve Get_Type(i)
    22. ID(i)=ID
    23. Get_Name(i) = COM.GetName(ID)
    24. Get_Type(i) = COM.GetType(ID)
    25. i = i + 1
    26. Next
    27. 'Kleinste und gröste Index in Array ermitteln
    28. ArrayUbound_ID = UBound(ID)
    29. ArrayLbound_ID = LBound(ID)
    30. ArrayUbound_GetName = UBound(Get_Name)
    31. ArrayLbound_GetName = LBound(Get_Name)
    32. ArrayUbound_GetType = UBound(Get_Type)
    33. ArrayLbound_GetType = LBound(Get_Type)
    34. '****************************************************************************************************************
    35. '****************************************************************************************************************
    36. 'nur als Beispiel, ich nehme ein ChekBox.
    37. 'ChekBox = Cheked/ dann IDs in ComboBox Anzeige
    38. 'ChkeBox = Unchecked/ dann IDs in ComboBox ausblenden
    39. If ChekBox.Value = Checked Then
    40. For z1 = ArrayLbound_ID To ArrayUbound_ID
    41. 'In ComboBox Name und ID anzeigen
    42. ComboBox2.Items.Add (Get_Name(z1)) & " " & "ID:" & " " ID(z1))
    43. End IF
    44. If ChekBox.Value = Unchecked Then
    45. For z1 = ArrayLbound_ID To ArrayUbound_ID
    46. 'In ComboBox nur "Name" anzeigen
    47. ComboBox2.Items.Add (Get_Name(z1))
    48. Next
    49. End If
    50. Next



    Mfg Alex

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

    Hallo Alex.

    Die ID soll nicht im String stehen, aber trotzdem an der Auswahl hängen.

    In der VB Hilfe gibts einen Verweis auf die Möglichkeit, zu einem Namen (DisplayMember) einen (versteckten) Wert (ValueMember) zu speichern.
    Da will ich hin.

    ....
    DisplayMember
    Die Spalte der Datenquellentabelle, die Sie im Steuerelement anzeigen möchten. Im vorherigen Szenario ist dies "Name" (muss im Code in Anführungszeichen gesetzt werden).

    ValueMember
    Die Spalte der Datenquellentabelle, in der die gespeicherten Informationen enthalten sind. Im vorherigen Szenario ist dies "ID" (muss im Code in Anführungszeichen gesetzt werden).
    ....

    Wie schaffe ich es, daß, wenn der Benutzer in der ComboBox "Audi A4" auswählt, ich bei der Abfrage der Selektion die zugehörige ID, also 4000 zurück bekomme??
    Was soll der Spruch?

    Wenn die Beispiele in der Hilfe mein Problem einfach lösen würden, würd ich mir nicht die Mühe machen, hier weiter zu posten.

    Vielleicht setzt du dich hin und machst dir die Mühe, das zu verstehen, was andere schreiben, bevor du irgendwas antwortest.
    Über Google habe ich folgendes herausbekommen, du benötigst für ValueMember und DisplayMember ein DataSet:

    VB.NET-Quellcode

    1. MeineCombobox.DataSource = MeinDataSet.Tabels("irgendeintabellenname")
    2. MeineCombobox.DisplayMember = "FeldnameMitBeschreibung"
    3. MeineCombobox.ValueMember = "FeldnameMitID"
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau