Beantwortet combobox in c# mit einem string ansprechen

  • Mittwoch, 19. September 2012 15:55
     
     

    Hallo, ich habe in meiner Windowsform eine combobox mit dem Namen "cbx_testname".

    Jetzt habe ich eine xml configdatei, in welcher als attribut der Name der combobx, der Tabindex und startwert usw. steht.

    jetzt möchte ich beim einlesen der config natürlich etwas flexibel bleiben und irgendwie indirekt über den namen (Eingelesenen string) die attribute wie tabindex startwert usw. der passenden box zuordnen. geht das irgendwie?   Danke schon mal im Voraus

Alle Antworten

  • Mittwoch, 19. September 2012 17:22
    Moderator
     
     Beantwortet

    Hallo,

    verstehe ich das richtig, das du in deiner config-Datei "cbx_testname" stehen hast, und dann damit auf deine ComboBox zugreifen willst?

    IMHO kann Windows Forms das nicht, da jedes Objekt als Variable angelegt wird. In WPF ginge es bspws. mit einem LogicalTreeHelper. Ich würde mich gern eines besseren belehren lassen, wenn es doch in WinForms geht.

    PS: Was machst du denn wenn da mal etwas falsches steht und dein Programm dann die ComboBox leer lässt? Ich würde nach jeder ComboBox einzeln Abfragen. Ich würde deine Idee verstehen, wenn du mehrere Hundert ComboBoxen hast, was du aber sicherlich nicht hast.


    Koopakiller - http://koopakiller.ko.ohost.de/

  • Mittwoch, 19. September 2012 22:10
     
     Beantwortet Enthält Code

    Hallo,

    auch mit Windows Forms geht es, aber genau wie Koopakiller halte ich diese Vorgehensweise für seeeeehr Fehleranfällig (z. B. SelectedIndex ist höher als die Anzahl der Einträge etc....) und nicht empfehlenswert.

    Aber da es technisch geht, nachfolgend mein kurzes Code-Beispiel.

    Da es dir hier nur um das Finden von passenden UI-Elementen ging, habe ich deine Config-Datei als Liste von Items zur Verdeutlichung implementiert. Außerdem habe ich genau zwei ComboBox-Elemente auf der Form mit dem Namen comboBox1 und comboBox2.

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } class Item { public string Name { get; set; } public int CurrentIndex { get; set; } } private void Form1_Load(object sender, EventArgs e) { // Befüllen der ComboBoxen mit jeweils drei Einträgen comboBox1.Items.Add("Item 1.1"); comboBox1.Items.Add("Item 1.2"); comboBox1.Items.Add("Item 1.3"); comboBox2.Items.Add("Item 2.1"); comboBox2.Items.Add("Item 2.2"); comboBox2.Items.Add("Item 2.3"); List<Item> lsItems = new List<Item>(); lsItems.Add(new Item() { Name = "comboBox1", CurrentIndex = 2 }); lsItems.Add(new Item() { Name = "comboBox2", CurrentIndex = 1 }); foreach (Item cItem in lsItems) { foreach (Control c in this.Controls) {

    // Prüft ob der Name des "Controls" dem aus der Liste entspricht! if (c.Name == cItem.Name) { System.Diagnostics.Debug.WriteLine(string.Format("{0} - Hallo", cItem.Name)); ComboBox cBox = (ComboBox)c; // Nur wenn es eine ComboBox ist! if (cBox != null) { cBox.SelectedIndex = cItem.CurrentIndex; } break; } } } } }

    Und hier noch das Ergebnis als Screenshot (man verzeih mir, dass es keine vorbildlich gestalltene UI ist!).


    Gruß
    Rudolf

    "Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw


  • Montag, 24. September 2012 17:39
     
     Beantwortet

    Hallo,

    es gibt im Windows Form das Controls Property. Dieses zeigt auf ein ControlCollection Objekt in der alle Controls des Forms enthalten sind. Der Schlüssel der ControlCollection ist der Name des Controls.

    Anbei ein Beispiel. Da ich nur wenig Ahnung von C# habe in VB. Ist einfach zu lesen.


      Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        Try
          ComboBox_Properties_Set("ComboBox2", _
                                                     4,
                                                     2)

          ComboBox_Properties_Set("ComboBox2", _
                                                      Nothing,
                                                      3)
        Catch ex As Exception
          MsgBox(ex.Message)
        End Try
      End Sub


      Private Sub ComboBox_Properties_Set(ByVal pstrName As String, _
                                                                     ByVal pintTabIndex As System.Nullable(Of Integer), _
                                                                     ByVal pintSelectedIndex As System.Nullable(Of Integer))
        ' Parameter für die Combo_Box Properties sind als
        ' System.Nullable deklariert um festzulegen ob Property gesetzt werden soll oder nicht.

        Dim cmbComboBox As ComboBox

        ' Nachsehen ob eine ComboBox mit dem Namen pstrName existiert.
        If Not Me.Controls.ContainsKey(pstrName) Then
          Throw New ArgumentException(pstrName & " ist kein Steuerelement von " & Me.Name)
        End If
        If Not TypeOf Controls(pstrName) Is ComboBox Then
          Throw New ArgumentException(pstrName & " ist keine ComboBox.")
        End If

        cmbComboBox = DirectCast(Me.Controls(pstrName), ComboBox)

        ' Werte setzen.
        If pintTabIndex.HasValue Then
          cmbComboBox.TabIndex = pintTabIndex.Value
        End If

        If pintSelectedIndex.HasValue Then
          If pintSelectedIndex.Value < -1 _
          OrElse pintSelectedIndex.Value >= cmbComboBox.Items.Count Then
            Throw New ArgumentException("Ungültiger SelectedIndex Parameter für " & _
                                                               Me.Name & "." & cmbComboBox.Name)
          End If

          cmbComboBox.SelectedIndex = pintSelectedIndex.Value
        End If
      End Sub
    End Class


  • Freitag, 19. Oktober 2012 12:24
    Besitzer
     
     

    Hallo Bensen83,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.