none
Combobox Item mit Wert versehen (Windows Forms) RRS feed

  • Frage

  • Werte Community,

    ich habe folgenden Probe Code:

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {

                // Analyse der Combobox auswahl
                dynamic item = comboBox1.SelectedItem as dynamic;

                 dynamic item2 = comboBox2.SelectedItem as dynamic;
                    


                //Rechnen ( Wert Combobox1 bis Wert Combobox 2 addieren)
                for (int counter = item; counter < item2; counter++)
                



                    // Ausgabe des Wertes
                textBox1.Text = item;
            }
        }
    }

    In der Combobox habe ich bei der Eigenschaft mehrere Items.

    Mit

     dynamic item = comboBox1.SelectedItem as dynamic;

    lese ich das momentan ausgewähle Feld aus.

    Wie kann ich den auswählbaren Items einen Wert zuweisen mit dem ich dann in meiner "for"schleife rechnen kann?

    Lieben Gruß

    Castell

    Mittwoch, 2. April 2014 21:38

Antworten

  • Hallo Castell,

    die Wahl von "dynamic" ist für den geschilderten Anwendungsfall etwas unglücklich. In C# ist dynamic ein Typ, dass - wie Object auch, jedes andere Objekt referenzieren kann. Operatoren, die auf Ausdrücken vom Typ dynamic angewandt werden, werden erst zur Laufzeit aufgelöst. Das bedeutet, dass man auch Operatoren angeben kann mit denen der eigentliche Laufzeittyp nichts anfangen kann. Das führt dann zur Laufzeit zu einer Exception. Dafür ist dein Code predestiniert, denn Du castest comboBox1.SelectedItem als dynamic und verwendest etwas weiter den "<"-Operator. Falls zur Laufzeit das SelectedItem vom Typ String ist, hast Du ein Problem: Denn String kann mit diesem Operator nichts anfangen.

    Also mal angenommen, dass Du beim Laden der Form folgenden Code schreibst:

    comboBox1.Items.AddRange(new object[] { 1, 2, 3, "A" });
    comboBox2.Items.AddRange(new object[] { 1.01m, 2.02f, 3.03d, "B"});

    Wählst Du nun zur Laufzeit jeweils den letzten Eintrag und drückst die Schaltfläche zum Berechnen, erhältst Du eine RuntimeBinderException, weil die Zuweisung int Counter = item fehlschlägt: String kann ja nicht implizit in ein Int32 konvertiert werden. Das gleiche passiert auch wenn Du jeweils den ersten Eintrag wählst. Allerdings erst bei der Zuweisung textBox1.Text = item. Diesmal kann ein int-Typ nicht automatisch in ein string konvertiert werden.

    Auch wenn C# das keyword "dynamic" kennt, ist C# noch immer eine statisch typisierte Sprache und keine dynamische. Man hat also weiterhin die Verantwortung für Datentypkonversionen und für die Selektion von für den jeweiligen Typ gültigen Operatoren.

    Die for-Schleife macht für mich irgendwie auch wenig Sinn. Selbst wenn man textBox1.Text = Convert.ToString(item) schreibt um dem Konversionsfehler aus dem Weg zu gehen, würde der Inhalt der TextBox bei jedem Durchlaufen der Schleife mit dem neuen Wert überschrieben werden.

    Mein Vorschlag deshalb: Verwende statt dynamic einen vordefinierten numerischen Typ (int, float, double, decimal etc.) und bei der Zuweisung an die TextBox verwende eine explizite Konvertierung. So wird das Ganze gelingen.

    Weitere Informationen zu "dynamic" findest Du hier:
    Verwenden des Typs dynamic (C#-Programmierhandbuch)

    Viel Spaß mit C# weiterhin
    Marcel

    Donnerstag, 3. April 2014 04:28
    Moderator

Alle Antworten

  • Hi Castell,

    zu deine Frage: Das ist ganz einfach du verwendet Typen mit denen man auch rechen kann. z.b. int oder double.

    Die nötigen Informationen findest du hier. Bitte ganz durch lesen/arbeiten.

    MFG

    Björn

    p.s.

    Mal eben herunter geschrieben Fragen, ergeben mal eben herunter geschrieben Antworten.

    Gib dir mehr mühe bei der Frage und dann gebe ich mir auch mehr mühe bei der Antwort ;)

    • Bearbeitet Palin Mittwoch, 2. April 2014 23:18
    Mittwoch, 2. April 2014 23:12
  • Hallo Castell,

    die Wahl von "dynamic" ist für den geschilderten Anwendungsfall etwas unglücklich. In C# ist dynamic ein Typ, dass - wie Object auch, jedes andere Objekt referenzieren kann. Operatoren, die auf Ausdrücken vom Typ dynamic angewandt werden, werden erst zur Laufzeit aufgelöst. Das bedeutet, dass man auch Operatoren angeben kann mit denen der eigentliche Laufzeittyp nichts anfangen kann. Das führt dann zur Laufzeit zu einer Exception. Dafür ist dein Code predestiniert, denn Du castest comboBox1.SelectedItem als dynamic und verwendest etwas weiter den "<"-Operator. Falls zur Laufzeit das SelectedItem vom Typ String ist, hast Du ein Problem: Denn String kann mit diesem Operator nichts anfangen.

    Also mal angenommen, dass Du beim Laden der Form folgenden Code schreibst:

    comboBox1.Items.AddRange(new object[] { 1, 2, 3, "A" });
    comboBox2.Items.AddRange(new object[] { 1.01m, 2.02f, 3.03d, "B"});

    Wählst Du nun zur Laufzeit jeweils den letzten Eintrag und drückst die Schaltfläche zum Berechnen, erhältst Du eine RuntimeBinderException, weil die Zuweisung int Counter = item fehlschlägt: String kann ja nicht implizit in ein Int32 konvertiert werden. Das gleiche passiert auch wenn Du jeweils den ersten Eintrag wählst. Allerdings erst bei der Zuweisung textBox1.Text = item. Diesmal kann ein int-Typ nicht automatisch in ein string konvertiert werden.

    Auch wenn C# das keyword "dynamic" kennt, ist C# noch immer eine statisch typisierte Sprache und keine dynamische. Man hat also weiterhin die Verantwortung für Datentypkonversionen und für die Selektion von für den jeweiligen Typ gültigen Operatoren.

    Die for-Schleife macht für mich irgendwie auch wenig Sinn. Selbst wenn man textBox1.Text = Convert.ToString(item) schreibt um dem Konversionsfehler aus dem Weg zu gehen, würde der Inhalt der TextBox bei jedem Durchlaufen der Schleife mit dem neuen Wert überschrieben werden.

    Mein Vorschlag deshalb: Verwende statt dynamic einen vordefinierten numerischen Typ (int, float, double, decimal etc.) und bei der Zuweisung an die TextBox verwende eine explizite Konvertierung. So wird das Ganze gelingen.

    Weitere Informationen zu "dynamic" findest Du hier:
    Verwenden des Typs dynamic (C#-Programmierhandbuch)

    Viel Spaß mit C# weiterhin
    Marcel

    Donnerstag, 3. April 2014 04:28
    Moderator
  • Hi,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.

    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,

    Ciprian


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





    Mittwoch, 16. April 2014 15:25