2016-10-25 3 views
0

Ich habe 2 Panels mit Textfeldern und Labels.Ich versuche, die Summe von panel1.texbox1 * panel2.textbox1 + panel1.textbox2 ... und so weiter.Aber wenn ich das Programm ausführen es zeigt mir tatsächlich das Produkt aller Textfelder.Foreach Summe der Textfelder C#

Hier habe ich den Code für Textfelder und Etiketten zu erstellen:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    int j,c=1; 
    int i = comboBox1.SelectedIndex; 
    if (i != null) 
    { 
     for (j = 0; j <= i; j++) 
     { 
      Label label = new Label(); 

      label.Text = "w" + c; 
      label.Location = new System.Drawing.Point(5, 20 + (20 * c)); 
      label.Size = new System.Drawing.Size(30, 20); 
      panel1.Controls.Add(label); 
      Label label2 = new Label(); 
      label2.Text = "x" + c; 
      label2.Location = new System.Drawing.Point(5, 20 + (20 * c)); 
      label2.Size = new System.Drawing.Size(30, 20); 
      panel3.Controls.Add(label2); 
      TextBox w = new TextBox(); 
      w.Text = ""; 
      w.Location = new System.Drawing.Point(35, 20 + (20 * c)); 
      w.Size = new System.Drawing.Size(25, 20); 
      panel1.Controls.Add(w); 

      TextBox x = new TextBox(); 
      x.Text = ""; 
      x.Location = new System.Drawing.Point(35, 20 + (20 * c)); 
      x.Size = new System.Drawing.Size(25, 20); 
      panel3.Controls.Add(x); 

      c++; 
     } 
    } 
} 

Und hier ist der Code, den ich zu verwenden versucht:

private void button4_Click(object sender, EventArgs e) 
{ 
    int suma = 0; 
    foreach (Control w1 in panel1.Controls.OfType<TextBox>()) 
    {        
     foreach (Control w2 in panel3.Controls.OfType<TextBox>()) 
     { 
      int textB1 = int.Parse(w1.Text); 
      int textB2 = int.Parse(w2.Text); 
      int textB3 = textB1 * textB2; 
     }  
    } 
    textBox3.Text = "" + suma; 
} 
+0

Haben Sie die erwarteten Werte im Vergleich zu den Werten, die Sie erhalten, überprüft und überprüft? –

+1

Wenn Sie möchten, tb1 * tb1 + tb2 * tb2 usw. - vorausgesetzt, beide Panels enthalten die gleiche Anzahl von Steuerelementen sollten Sie Ihre Schleifen (beide) mit 'für (int i = 0; i (). Count; i ++) 'und dann kann die eigentliche Arithmetik einfach' int sein textB1 = int.Parse (panel1.Controls.OfType () [i]; 'und die zweite ist die gleiche, aber Panel 3. –

+0

@BviLLe_Kid Hat es getan , verschiedene Zahlen bekommen – mihai11

Antwort

0

Sie können es mit Linq in einer Zeile tun, aber Sie werden natürlich haben für gültige Eingabe in die Textfelder überprüfen zuerst:

var panel1Texts = panel1.Controls.OfType<TextBox>().ToArray(); 
    var panel2Texts = panel2.Controls.OfType<TextBox>().ToArray(); 

    Func<TextBox, bool> isInvalid = (text) => 
    { 
    int res; 
    return !int.TryParse(text.Text, out res); 
    }; 

    var errorText = panel1Texts.FirstOrDefault(isInvalid); 
    if (errorText != null) 
    { 
    // Error handling 
    } 

    errorText = panel2Texts.FirstOrDefault(isInvalid); 
    if (errorText != null) 
    { 
    // Error handling 
    } 

    var sum = panel1Texts.Zip(panel2Texts, (tb1, tb2) => int.Parse(tb1.Text) * int.Parse(tb2.Text)).Sum(); 

textBox3.Text = sum.ToString(); 
0

Nun, ich den Code nicht getestet haben, aber dies sollte Machen Sie die Arbeit:

Beachten Sie, dass dieser Code nicht sicher ist, müssen Sie einige Nullprüfungen hinzufügen, um den Code widerstandsfähiger zu machen

private void button4_Click(object sender, EventArgs e) 
{ 
    int suma = 0; 
    var listOfTextBoxesPanel1 = new List<string>(); 
    var listOfTextBoxesPanel2 = new List<string>(); 
    foreach (Control w1 in panel1.Controls.OfType<TextBox>()) 
    { 
     listOfTextBoxesPanel1.Add(w1.text); 
    } 
    foreach (Control w2 in panel2.Controls.OfType<TextBox>()) 
    { 
     listOfTextBoxesPanel2.Add(w2.text); 
    } 

    for (int i = 0; i < listOfTextBoxesPanel1.Count; i++) 
    { 
     suma = suma + (int.Parse(listOfTextBoxesPanel1[i])* int.Parse(listOfTextBoxesPanel2[i]))); 
    } 
    textBox3.Text = "" + suma; 
} 

Viel Glück!

+0

Das Programm stürzt bei mit einer nicht abgeholten Ausnahme ab – mihai11

0

In Ihrem aktuellen Code sind Sie alle Ihre Steuerelemente einschließlich Ihrer Etiketten in Textfeld, indem Sie OfType<TextBox>() auf sie als die Sammlung auch Etiketten enthalten. Hier
ist, was ich denke, Sie sollten tun:

TextBox3.Text = (Panel1.Controls.OfType<Control>().Where(c => c.GetType() == typeof(TextBox)).Sum(v => int.Parse(v.Text)) + Panel2.Controls.OfType<Control>().Where(x => x.GetType() == typeof(TextBox)).Sum(z => int.Parse(z.Text))).ToString(); 
+0

Das Ergebnis ist immer noch falsch, danke für den Tipp von der Weg. – mihai11

+0

Können Sie mir genau sagen, was Sie erwarten? – Niklas

+0

so Wenn in panel1 I-Typ: 1 und in panel2 I-Typ: 2 ich sollte: 14 (1 * 2 + 3 * 4) – mihai11