2011-01-09 4 views
2

Wie vermeide ich Code wie diesen?Kann jemand eine knappe Lösung für dieses Problem in C# empfehlen?

dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJan.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtMar.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtApr.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtFeb.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtMay.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJun.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJul.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtAug.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtSep.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtOct.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtNov.Text, 0); 
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtDec.Text, 0); 
+0

Ist dies WinForms oder Webformulare? – Oded

+0

Verwenden Sie keine ungarische Notation. – SLaks

+2

@SLaks Verwenden Sie nicht USELESS ungarischen Notation, siehe: http://www.joelonsoftware.com/articles/Wrong.html – Stefan

Antwort

2

sie in irgendeiner Art von Eltern Kontrolle haben ... Unter der Annahme,

for(var control in ParentControl.Controls){ 
    dblCalcTotal += Utils.GetDecimal(control.Text, 0); 
} 
+0

Und angenommen, dass es keine anderen Kontrollen im Elternteil gibt, was unwahrscheinlich ist. – SLaks

+0

Wirklich? Sie gruppieren nie Ihre Kontrollen? Wenn ich eine Gruppe von "Monats" -Steuerelementen hätte, würde ich sie in einen Container legen ... – jvenema

1

Wie ist das?

double dblCalcTotal = Sum(txtJan.Text, txtFeb.Text, txtMar.Text .....); 

private static double Sum(params string[] list) 
{ 
    double result = 0; 
    foreach (string s in list) 
    { 
     result += Utils.GetDecimal(s, 0); 
    } 
    return result; 
} 
0

Fügen Sie zunächst Ihre Textfelder zu einer List:

List<TextBox> months = new List<TextBox>(); 
months.add(txtJan); 
months.add(txtFeb); 
... 

in Ihrer Methode Dann:

foreach (Textbox month in months) 
{ 
    dblCalcTotal += Utils.GetDecimal(month.Text, 0); 
} 
+0

@Slaks: Ok, siehe meine Edits –

1

Legen Sie Ihre Textfelder in ein List<TextBox>.

Anschließend können Sie LINQ verwenden:

calcTotal += monthBoxes.Sum(t => Utils.GetDecimal(t.Text, 0)); 
+0

MonthBoxwes könnte vielleicht eine LINQ-Abfrage auch? (nicht sicher, ob controlcollection das unterstützt) – Stefan

+0

@Stefan: Sie könnten 'someParent.Controls.OfType () .Where (c => ???)' schreiben. – SLaks

2

Eine einfache Schleife würde es tun:

var items = new[] {txtJan, txtFeb, txtMar...}; 
dblCalcTotal = 0; 
foreach(var item in items) { 
    dblCalcTotal += Utils.GetDecimal(item.Text, 0); 
} 
0

Können Sie die Monatsfelder zu einem Kontrollfeld machen?

Wenn ja, verkürzt sich der Code dazu:

for (int i = 0; i < txtMonths.Length; i++) 
    dblCalcTotal += Utils.GetDecimal(txtMonth[i].Text, 0); 
2

Jedes Mal, wenn Sie so viele Kontrollen haben, sollten Sie denken über eine bessere Kontrolle beginnen, eine, die mehr als einen Wert an. DataGridView ist hier die beste Wahl, da es die Bearbeitung ermöglicht. Dies bietet auch eine großartige Möglichkeit, Ihre Benutzeroberfläche automatisch in jeder Sprache zu verwenden. Lassen Sie eine DGV auf dem Formular, machen den Konstruktor wie folgt aussehen:

Public Sub New() 
    InitializeComponent() 
    Dim col = DataGridView1.Columns.Add("sales", "Sales") 
    DataGridView1.Columns(col).ValueType = GetType(Decimal) 
    DataGridView1.AllowUserToAddRows = False 
    DataGridView1.AllowUserToDeleteRows = False 
    DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders 

    With System.Globalization.CultureInfo.CurrentUICulture 
     DataGridView1.Rows.Add(.Calendar.GetMonthsInYear(DateTime.Now.Year)) 
     For Each row As DataGridViewRow In DataGridView1.Rows 
      row.HeaderCell.Value = .DateTimeFormat.MonthNames(row.Index) 
      row.Cells(col).Value = 0 
     Next 
    End With 
End Sub 

Nun ist die Gesamt Berechnung wird einfach:

Private Sub ButtonTotalSales_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTotalSales.Click 
    Dim sales As Decimal = 0 
    For Each row As DataGridViewRow In DataGridView1.Rows 
     sales += CDec(row.Cells("sales").Value) 
    Next 
    '' etc.. 
End Sub 
+0

Oh Mist, falsche Sprache. Nun, dieselbe Idee. –

Verwandte Themen