2011-01-09 11 views
2

どうすればこのようなコードを避けることができますか?誰かが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); 
+0

は、このリサイズまたはWebフォームですか? – Oded

+0

ハンガリー表記は使用しないでください。 – SLaks

+2

@SLaks USELESSのハンガリー語表記を使用しないでください:http://www.joelonsoftware.com/articles/Wrong.html – Stefan

答えて

2

彼らは親コントロールのいくつかの並べ替えにしていると仮定すると...

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

親に他のコントロールがないと仮定しますが、これはありそうもありません。 – SLaks

+0

本当ですか?コントロールをグループ化することはありませんか? "月"コントロールのグループがあれば、私はそれらをコンテナに入れます。 – jvenema

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

まず、リストにあなたのテキストボックスを追加します。

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

次に、あなたのメソッド内:

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

@スラックス:私の編集を参照してください –

1

List<TextBox>にあなたのテキストボックスを置きます。

その後、LINQを使用することができます。

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

MonthBoxwesはおそらくLINQクエリかもしれませんか? (コントロールコレクションがそれをサポートしているかどうかは分かりません) – Stefan

+0

@Stefan: 'someParent.Controls.OfType ().Where(c => ???)'と書くことができます。 – SLaks

2

単純なループがそれを行うだろう:

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

月のボックスをコントロール配列にすることはできますか?

はそうであれば、コードはこれに短縮:あなたはこの多くのコントロールを持っているときはいつでも

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

は、あなたがよりよい制御、複数の値を示し、1について考え始める必要があります。編集が可能なので、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 
+0

ああ、おかしい、間違った言葉。まあ、同じ考え。 –

関連する問題