有人可以在C#中为这个问题推荐一个简洁的解决方案吗?

时间:2011-01-09 16:57:59

标签: c#

如何避免这样的代码?

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);

7 个答案:

答案 0 :(得分:2)

一个简单的循环可以做到:

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

答案 1 :(得分:2)

假设他们在某种父母的控制下......

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

答案 2 :(得分:2)

每当你有这么多控件时,你应该开始考虑一个更好的控件,一个显示多个值的控件。 DataGridView是这里的最佳选择,因为它允许编辑。这也为自动使用任何语言的UI工作提供了很好的机会。在表单上放一个DGV,使构造函数看起来像这样:

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

现在计算总数变得简单了:

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

答案 3 :(得分:1)

这是怎么回事?

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;
}

答案 4 :(得分:1)

将文本框放入List<TextBox>

然后您可以使用LINQ:

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

答案 5 :(得分:0)

首先,将文本框添加到列表中:

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

然后,在你的方法中:

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

答案 6 :(得分:0)

您可以将月份框设为控制数组吗?

如果是这样,代码缩短为:

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