none
Combobox/Txtbox auslesen->Bereich definieren und berechnen C# RRS feed

  • Frage

  • Hallo werte Community,

    da ich noch neu in C# bin wende ich mich an euch.

    Ich habe eine neues Projekt. Dabei kann der Benutzer in der Combobox 1 und 2 einen wert auswählen (oder über 2 txtbox eintragen). Anschließend soll über das Ereignis eines Button Clicks die ausgewählten Werte der Combobox( oder Textboxen) ausgelesen werden und in dem definiertem Bereich dann gerechnet werden.

    bsp:

    int S1 = 10;

    int S2 = 20;

    int S3 = 30;

    int S4 = 40;

    Wert Combobox 1 = S1        Wert Combobox2 = S3

    Per Buttonclick sollen die Werte erfasst werden und dann sollen alle Werte in dem Bereich S1 und S3 zusammen addiert werden und als Zwischenergebnis im Code zu weiteren Rechenwegen zwischen gespeichert werden.

    Wer kann mir da helfen bei dem Code für dieses Beispiel?

    Kann mir jemand gute Lektüre die eben sowas mit umfasst empfehlen?

    Gruß Castell (=

    Montag, 31. März 2014 15:02

Antworten

  • Für die 2. ComboBox wiederhohlst du nochmal genau das Selbe. Wenn cb1 und cb2 die selben Elemente haben sollen, kannst du auch die gleiche Liste als ItemsSource verwenden:
    cb1.ItemsSource = entries;
    cb2.ItemsSource = entries;
    Im Click-Handler kannst du nun einfach von beiden ComboBoxen den Wert auslesen. Die beiden int-Werte kannst du dann beliebig verrechnen. Beispielsweise Multiplizieren:
    int value1 = (cb1.SelectedItem as dynamic).Value;//Das war in meiner ersten Antwort noch in 2 Zeilen gespalten
    int value2 = (cb2.SelectedItem as dynamic).Value;
    
    int multiply = value1 * value2;
    MessageBox.Show(multiply.ToString());
    Wenn du alle Elemente der ComboBoxen zusammen rechnen willst, kannst du einfach ItemsSource wieder auslesen und in einer Schleife durchlaufen:
    int sum = 0;
    foreach (dynamic item in cb1.ItemsSource)
    {
        sum += item.Value;
    }
    MessageBox.Show(sum.ToString());//Ausgabe zum testen
    Kürzer wäre es mit LINQ:
    int sum = cb1.ItemsSource.Cast<dynamic>().Sum(x => x.Value);
    Durch den Aufruf von Cast wird wieder eine Liste von dynamic erzeugt (keine List<T> sondern ein IEnumerable<T>). Sum summiert dann alle Elemente. Im inneren des Aufrufs gebe ich mit, das ich die Value-Eigenschaft summieren will.




    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tervet Montag, 31. März 2014 16:24
    Montag, 31. März 2014 16:10
    Moderator

Alle Antworten

  • Hi,
    bist Du Anfänger oder kann es auch ein MMVM-Lösung sein?

    --
    Peter

    Montag, 31. März 2014 15:21
  • Kann man noch als Anfänger bezeichnen^^
    Was heißt MMVM?
    Montag, 31. März 2014 15:28
  • Hallo,
    ich hoffe mal, das ich es richtig verstanden habe: Du hast eine ComboBox mit verschiedenen Werten. Jeder dieser Werte hat einen bestimmten Zahlenwert. Und mit diesem Zahlenwert willst du rchnen. Da dürfte das Problem wohl das heraus suchen des Zahlenwerts sein.

    Ich will dich als Anfänger nicht "überfordern", asber die für mich einfachste Lösung geht über dynamische Typen. Deine ComboBox hat bei mir den Namen cb1:

    <ComboBox Name="cb1" ...

    Im Konstruktor weißen wir dann die ItemsSource zu. ItemsSource kann man eine Auflistung übergeben, wodurch diese dann angezeigt werden.

    public MainWindow()
    {
    InitializeComponent();//Erst das XAML initialisieren List<dynamic> entries = new List<dynamic>(); entries.Add(new { Name = "S1", Value = 10 }); entries.Add(new { Name = "S2", Value = 20 }); entries.Add(new { Name = "S3", Value = 30 }); entries.Add(new { Name = "S4", Value = 40 }); cb1.ItemsSource = entries; }

    Wie du siehst, erstelle ich eine Liste vom Typ dynamic. Ein dynamischer Typ kann  man mit einer Klasse vergleichen, die man jedoch nicht extra erstellen muss. Der Compiler erkennt automatisch, das es 2 Eigenschaften (Name und Value) gibt. Name wollen wir anzeigen und mit Value rechnen.

    Damit auch der richtige Wert angezeigt wird, kannst du die die DisplayMemberPath-Eigenschaft der ComboBox setzen:

    <ComboBox Name="cb1" DisplayMemberPath="Name"></ComboBox>

    Nun kannst du in deinem Button-Click-Handler das ausgewählte Item auslesen. Dieses ist nun auch eine dynamisches Objekt. Es muss nur gecastet werden:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        dynamic item = cb1.SelectedItem as dynamic;
        int value = item.Value;
    }

    Visual Studio zeigt dir nicht an, welche Eigenschaften item hat, darum musst du sicher gehen das du den Namen auch richtig geschrieben hast.

    Mit dem abgerufenen int-Wert kannst du dann weiter rechnen.

    Zur gesuchten Lektüre:
    Es gibt einige kostenlose Bücher von Galileo OpenBook. U.A.: Visual C# 2012
    Die enthalten alles wichtige.

    PS: Diese Lösung kann man später auch auf recht einfach auf das MVVM-Muster umbauen.
    MVVM = Model-View-ViewModel Ein Pattern zur Programmgestaltung.
    Siehe auch: http://msdn.microsoft.com/de-de/magazine/dd419663.aspx
    Dafür solltest du aber die Grundlagen fest verinnerlicht haben. Soweit ich weiß, wird das aber in so gut wie jedem Buch das WPF behandelt wenigstens angerissen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Montag, 31. März 2014 15:34
    Moderator
  • Wenn ich das richtig verstanden habe ist das dann 1 Cbox würde ja mit einer 2. sicherlich auch so funktionieren. Wie kan ich jetzt noch festlegen das wenn Cbox 1 =S1 und Cbox 2= S4  alle Wert (S1,S2,S3,S4) zusammengerechnet werden sollen?

    Montag, 31. März 2014 16:01
  • Für die 2. ComboBox wiederhohlst du nochmal genau das Selbe. Wenn cb1 und cb2 die selben Elemente haben sollen, kannst du auch die gleiche Liste als ItemsSource verwenden:
    cb1.ItemsSource = entries;
    cb2.ItemsSource = entries;
    Im Click-Handler kannst du nun einfach von beiden ComboBoxen den Wert auslesen. Die beiden int-Werte kannst du dann beliebig verrechnen. Beispielsweise Multiplizieren:
    int value1 = (cb1.SelectedItem as dynamic).Value;//Das war in meiner ersten Antwort noch in 2 Zeilen gespalten
    int value2 = (cb2.SelectedItem as dynamic).Value;
    
    int multiply = value1 * value2;
    MessageBox.Show(multiply.ToString());
    Wenn du alle Elemente der ComboBoxen zusammen rechnen willst, kannst du einfach ItemsSource wieder auslesen und in einer Schleife durchlaufen:
    int sum = 0;
    foreach (dynamic item in cb1.ItemsSource)
    {
        sum += item.Value;
    }
    MessageBox.Show(sum.ToString());//Ausgabe zum testen
    Kürzer wäre es mit LINQ:
    int sum = cb1.ItemsSource.Cast<dynamic>().Sum(x => x.Value);
    Durch den Aufruf von Cast wird wieder eine Liste von dynamic erzeugt (keine List<T> sondern ein IEnumerable<T>). Sum summiert dann alle Elemente. Im inneren des Aufrufs gebe ich mit, das ich die Value-Eigenschaft summieren will.




    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Tervet Montag, 31. März 2014 16:24
    Montag, 31. März 2014 16:10
    Moderator