2016-12-05 14 views
0

Screenshot of the Form初めてのポスターです。ここで何か助けが必要です。私は代理人、弁護士、代理店などを雇った後のアスリートの給与を計算するプログラムに取り組んでいます。給与*エージェントの一定割合を表示するリストボックスがあります。私は入力された数字の合計を得ることができないので、私は合計給与からそれらを引いてラベルに表示することができます。私はいくつかの助けを気に入っています.C#にはとても新しいものです。リストボックスの数値の合計を取得していますか?

問題の領域が、問題は、あなたがドル記号($)で始まる文字列としてデータを格納していることであるスイッチの下

public partial class athleteForm : Form 
{ 
    public athleteForm() 
    { 
     InitializeComponent(); 
    } 

    const decimal LAWYER_PERCENT = 0.10m; 
    const decimal AGENT_PERCENT = 0.05m; 
    const decimal PA_PERCENT = 0.03m; 
    const decimal TRAINER_PERCENT = 0.07m; 
    const string LAWYER_STRING = "Lawyer"; 
    const string AGENT_STRING = "Agent"; 
    const string PA_STRING = "Personal Assistant"; 
    const string TRAINER_STRING = "Trainer"; 
    string profFirstName; 
    string profLastName; 
    string profSelect; 
    decimal profPay; 


    public void athleteForm_Load(object sender, EventArgs e) 
    { 


    } 

    public void profAddButton_Click(object sender, EventArgs e) 
    { 
     decimal startingSalary = Convert.ToDecimal(startingSalaryText.Text); 
     profFirstName = profFirstNameText.Text; 
     profLastName = profLastNameText.Text; 
     profSelect = profComboBox.GetItemText(profComboBox.SelectedItem); 
     decimal lawyerPay = startingSalary * LAWYER_PERCENT; 
     decimal agentPay = startingSalary * AGENT_PERCENT; 
     decimal trainerPay = startingSalary * TRAINER_PERCENT; 
     decimal paPay = startingSalary * PA_PERCENT; 



     switch (profComboBox.GetItemText(profComboBox.SelectedItem)) 
     { 
      case "Lawyer": 
       profPay = lawyerPay; 
       break; 

      case "Agent": 
       profPay = agentPay; 
       break; 

      case "Trainer": 
       profPay = trainerPay; 
       break; 

      case "Personal Assistant": 
       profPay = paPay; 
       break; 


     } 

     profListBox.Items.Add(profFirstName + "  " + profLastName + "  " + profSelect); 
     profPayList.Items.Add("$ " + profPay); 

     //decimal sumOfListbox = 
     // (from string S in profPayList.Items 
     // select Convert.ToDecimal(S)) 
     // .Sum(); 

     decimal sum = 
    profPayList.Items 
      .Cast<string>() 
      .Sum(v => 
      { 
       decimal d; 
       return decimal.TryParse(v, out d) ? d : 0m; 
      }); 



     remainSalaryLabel.Text = (sum.ToString()); 
    } 

    public void clearButton_Click(object sender, EventArgs e) 
    { 

     switch (MessageBox.Show("Are you sure you want to clear all professionals?", 
      "WonderWord", 
      MessageBoxButtons.YesNoCancel, 
      MessageBoxIcon.Question)) 
     { 
      case DialogResult.Yes: 
       profListBox.Items.Clear(); 
       profPayList.Items.Clear(); 
       remainSalaryLabel.Text = " "; 
       break; 

      case DialogResult.No: 
       // "No" processing 
       break; 

      case DialogResult.Cancel: 
       // "Cancel" processing 
       break; 

     } 




    } 

} 

}

+2

OOP(オブジェクト指向プログラミング)を調べて学ぶことをお勧めします。リストボックスをデータ保持*コントロール*として保持するのではなく、データを表示する*ことができます。 – Jim

+1

ありがとうございますか?私には本当に助けになりませんか?手元にある問題を手伝ってくれますか? –

+0

"*ありがとう、本当に助けてくれないの?*"それはあなたが想像する以上にあなたを助けます。あなたは私のアドバイスを取ってほしいです。 – Jim

答えて

0

をコメントアウトされています。例えば"$ 5";

すべてのデータの合計を計算するときには、decimal.TryParseを正しく使用して、文字列を10進数に変換します。ただし、この場合、TryParseはドル記号のために数値を抽出できません。

したがって、修正するためのオプションは、これは、次のとおりです。

  1. を解析する前にドル記号を削除します。
  2. numberstylesと通貨記号を処理するオーバーロードを使用してください()。
  3. ドル記号を処理する必要がないように、ListBox内に格納する代わりに、合計する別の番号のリストを維持します。まだ数値を表示したい場合は、リストボックスに数値のリストをバインドし、新しい数値が追加されるたびに更新することができます。

オプション2は、コードの現在の状態にとって最適なオプションです。あなたのコードは次のようになりする必要があります、あなたは米国の文化を扱っていると仮定:

NumberStyles style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol; 
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); 

decimal sum = profPayList.Items 
     .Cast<string>() 
     .Sum(v => 
     { 
      decimal d; 
      return decimal.TryParse(v, style, culture, out d) ? d : 0m; 
     }); 

オプション3を使用すると、それはいくつかの他を解決するよう、あなたが持っているものを書き換えるための時間を持っている場合、私は一緒に行くことになるものです将来発生する可能性のあるコードに潜在的に問題があります。

+2

通貨を許可するNumberStylesを指定できる[Decimal.TryParse()](https://msdn.microsoft.com/en-us/library/ew0seb73(v = vs.110).aspx)オーバーロードを使用できますシンボルが前面に表示されます。 –

+0

@Idle_Mind、ありがとう。私はその情報を含める答えを更新しました。それは間違いなく最も簡単な修正です。 – Adrian

+0

助けてくれてありがとう、私はC#の初心者です。私はC#クラスの紹介のためのプロジェクトに取り組んでいます。 –

関連する問題