Benutzer mit den meisten Antworten
Combobox Item mit Wert versehen (Windows Forms)

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
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- Als Antwort markiert Ciprian Bogdan Mittwoch, 16. April 2014 15:25
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
-
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- Als Antwort markiert Ciprian Bogdan Mittwoch, 16. April 2014 15:25
-
Hi Cstell,
Hat Dir die Antwort von Marcel geholfen ? Wenn ja - bitte markiere diese "als Antwort".
Danke und Gruß,
Ciprian
Ciprian Bogdan, 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.
-
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-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.