2 ComboBoxen global befüllen

  • VB.NET

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

    2 ComboBoxen global befüllen

    Hallo zusammen,

    ​meine Aufgabenstellung zu der ich hänge...

    ​Ich habe 2 unterschiedliche Forms für meine Anwendung erstellt. In beiden ist jeweils eine Combobox, über die eine Auswahl für ein Land erfolgen soll. Die Items der Comboboxen sollen für beide gleich sein. Ich möchte diese also nur ein mal definieren, anstatt sie zwei mal zu füllen. Leider weiß ich nicht, wie ich sie ansteuern kann. Ich komme aus der Ecke VBA und bin auch leider noch nicht fündig geworden, wie man das macht. Ich bekomme es nur hin, indem ich das sozusagen doppelt Code. Find ich aber nicht gut.
    ​Wer kann helfen?

    Viele Grüße
    Claus

    Bodycount schrieb:

    anstatt sie zwei mal zu füllen
    Wenn Du sdas mit DataSource machst, musst Du diese zwei Mal erstellen bzw. clonen, sonst ändert sich die Selektierung parallel.
    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!
    @Bodycount Lässt Du uns an der Lösung teilhaben?
    Du bist gewiss nicht der letzte, der dieses Problem hat.
    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!
    Hey,

    oh, ja, ok. Guter Punkt. In meinem Fall habe ich mir einen globalen Array erstellt:

    Visual Basic-Quellcode

    1. Public arrAnreden As String() = New String() {
    2. "Familie",
    3. "Firma",
    4. "Frau",
    5. "Hallo",
    6. "Herr",
    7. "Sehr geehrte Damen und Herren"}


    Und eine Public Sub, um die beiden Comboboxen dann zu füllen:

    Visual Basic-Quellcode

    1. Public Sub AnredeFuellen(ByVal MyComboBoxName As ComboBox)
    2. Dim strDefaultAnrede As String = "Sehr geehrte Damen und Herren"
    3. Dim intAnrede As Integer
    4. MyComboBoxName.Text = strDefaultAnrede
    5. For intAnrede = 0 To 5
    6. MyComboBoxName.Items.AddRange(New Object() {arrAnreden(intAnrede)})
    7. If My.Computer.Registry.GetValue(strDefaultRegKey, "DefaultSalutation", strDefaultAnrede) = arrAnreden(intAnrede) Then
    8. MyComboBoxName.SelectedIndex = intAnrede
    9. End If
    10. Next intAnrede
    11. End Sub


    Im Code selber rufe ich dann nur noch das auf, wobei "CmbAnrede" der Name der Combobox ist.

    Visual Basic-Quellcode

    1. AnredeFuellen(CmbAnrede)


    Möchte ich eine weitere Combobox mit den gleichen Anreden füllen, rufe ich halt mit dem entsprechenden Namen der Combobox auf.
    Bei den Bereichen um Registry, lese ich mir meine Standard-Anrede aus der Registry.

    :)
    Claus
    @Bodycount Suboptimal.
    • Machst Du Option Strict On.
    • Kleistere nicht die Registry mit solch Informationen zu, nimm Settings.
    Und dann z.B. so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public arrAnreden As String() = New String() {
    2. "Familie",
    3. "Firma",
    4. "Frau",
    5. "Hallo",
    6. "Herr",
    7. "Sehr geehrte Damen und Herren"}
    8. Private defaultIndex As Integer = 5
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. AnredeFuellen(Me.ComboBox1, My.Settings.CB1)
    11. AnredeFuellen(Me.ComboBox2, My.Settings.CB2)
    12. End Sub
    13. Public Sub AnredeFuellen(ByVal MyComboBoxName As ComboBox, Auswahl As String)
    14. MyComboBoxName.Items.AddRange(arrAnreden)
    15. If arrAnreden.ToList().Contains(Auswahl) Then
    16. MyComboBoxName.SelectedItem = Auswahl
    17. Else
    18. MyComboBoxName.SelectedIndex = defaultIndex
    19. End If
    20. 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!
    Hey RodFromGermany,

    ​Danke! Ich sehe: noch viel lernen ich muss :) Komme aus der VBA/VB6-Ecke und merke gerade wie Schei_ _ das ist/war. Für mich einige Zeit her. Da muss ich vieles neu lernen. Allein der Tipp mit den Settings (weg von der Registry) ist ja endgeil. Mit Option Strict On bin ich noch am kämpfen. Dazu bau ich grad mein Projekt um. Da versuche ich eine Art Brief-Assistent für Word, ursprünglich auf Basis von VBA (in Word), auf ein VSTO COM-Add-In zu portieren. Da werden mich sicher noch viele Fragen treffen.

    Cherio,
    Claus
    Hab' da noch eine Nachfrage...
    Über folg. Link habe ich mir in Word 2016 eine custom TaskPane erstellt: msdn.microsoft.com/en-us/library/bb608590.aspx
    Diese wird über einen Toggle-Button ein- oder ausgeblendet. Nur wenn ich Option Strict On habe, dann bekomme ich einen Fehler in der folgende Zeile:

    VB.NET-Quellcode

    1. ​Globals.Ribbons.ManageTaskPaneRibbon.ToggleButton1.Checked = taskPaneValue.Visible

    ​Ich kann das zwar über eine Abfrage in den Griff bekommen, würde aber gerne verstehen wollen, warum der Fehler passiert und wie man ihn ggf. umgehen kann?
    @Bodycount Ich glaube, Du solltest mal Option Strict auf On stellen.
    Und:
    Diese Zuweisung macht für mich nicht ganz viel Sinn, denn die .Visible-Property wird ja auch von irgendwo geschaltet, da kannste das Checked parallel dazu mit machen.
    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!
    Der Fehler ist "error BC30574: "Option Strict On" lässt spätes Binden nicht zu."

    ​Mit folgender Abfrage kann ich das Problem beheben:

    VB.NET-Quellcode

    1. If MyTaskPaneValue.Visible = False Then
    2. MyTaskPaneValue.Visible = True
    3. Else
    4. MyTaskPaneValue.Visible = False
    5. End If


    ​Und wie bereits beschrieben ist Option Strict on.
    Vereinfachung:

    VB.NET-Quellcode

    1. MyTaskPaneValue.Visible = Not MyTaskPaneValue.Visible
    siehe Boolean, Vergleiche und bedingte Verzweigungen

    Aber dass diese Zeile den Fehler in

    Bodycount schrieb:


    VB.NET-Quellcode

    1. Globals.Ribbons.ManageTaskPaneRibbon.ToggleButton1.Checked = taskPaneValue.Visible
    heilt, glaub ich dir nicht.
    Da muss noch was anneres dran beteiligt sein.