2012-01-16 8 views
0

私はXMLファイルから作成したデータセットからデータを取り込むDatagridviewを持っています。この部分は機能し、データセットの内容全体をデータグリッドに表示することができます。私はdatagridviewを日付と売りフラグに基づいてフィルタリングするための追加された機能を持っています。これは、日付を順番に調べていくうちに、datagridviewが更新されるときにも正常に機能します。しかし、私は "フィルターをかけた"データグリッドビューでいくつかの計算を行う必要があります。これらの計算は、様々な通貨をGBPに変換する必要があります。ですから、これを行うための最善の方法に関するいくつかの調査の後、私は可視のdatagridviewをループし、可視のそれぞれをテストすることに決めました。これは私が思いつくコードです。残念なことに、それを実行するとすべてのテストが失敗し、 "入力文字列が正しい形式ではありません"例外で失敗するelse節を実行しようとします。しかし、私は価格と通貨の価値観を見て、現在の状況には存在していません...今はこだわっていて、助けていただければ幸いです。フィルタリングされたDataGridViewで計算を実行

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    switch (row["currency"].ToString()) 
    { 
     case "USD": 
      myCommission += double.Parse(row["commission"].ToString()) * (double.Parse(row["price"].ToString()) * UStoGB); 
      break; 

     case "EURO": 
      myCommission += double.Parse(row["commission"].ToString()) * (double.Parse(row["price"].ToString()) * EUtoGB); 
      break; 

     case else: 
      myCommission += double.Parse(row["commission"].ToString()) *(double.Parse(row["price"].ToString()); 
      break; 
    } 
} 

ない、これが答えのいずれかの優れていること:おそらく...この間違った方法についてのだろう

おかげ

ハリー

for (int i = 1; i < dataGridView1.Rows.Count; i++) 
      { 
       if (dataGridView1["currency", i].ToString() == "USD") 
       { 
        myCommission += double.Parse(dataGridView1["commission", i].ToString()) * (double.Parse(dataGridView1["price", i].ToString()) * UStoGB); 
       } 
       else if (dataGridView1["currency", i].ToString() == "EURO") 
       { 
        myCommission += double.Parse(dataGridView1["commission", i].ToString()) * (double.Parse(dataGridView1["price", i].ToString()) * EUtoGB); 
       } 
       else 
       { 
        myCommission += double.Parse(dataGridView1["commission", i].ToString()) * double.Parse(dataGridView1["price", i].ToString()); 
       } 

      } 
+0

としてその作業だけでのみ操作する方法を考え出すことができませんでしたフィルタリングされたデータであり、データソース内のすべてのデータではありません。まだプログラミングの途中で作業していますので、まだ多くのことを学ぶことができます...ポインタのおかげです。 – user1152667

+0

DataTable.DefaulViewを使用して、フィルタリングした結果をDataTable.DefaultView.ToTable()のように計算します。計算(SUM(IIF(currency = 'USD'、手数料* price * whatewer、IIF(currency = 'ユーロ'、手数料*価格* whatewer2)))))など)。 LINQを使って計算を行うこともできます。 – pistipanko

答えて

0

いくつかの注意と少し変化をイムこれをforeachに変更すると、列の正確な名前が何であるかを判断するために行を監視することができます。大文字と小文字の区別があります。また、XMLのインポートによって列の名前が変更されている可能性があります。

+0

ありがとうMohgerth、私はちょうど私が記事をチェックするためにログオンする直前に働いている:)しかし、私は別の6時間のために私の質問への回答を投稿させてもらえません。私はあなたが取った時を感謝し、ケース・ステートメントを私のソリューションに組み込むことを検討します。私はできるだけ早く投稿します...ありがとう – user1152667

+1

これは、DataGridViewRowがforeachではなく、DataRowであると仮定しています。 – pistipanko

+0

はいです。それに応じて更新。 – Mohgeroth

0

いずれかの方法でブレークポイントを入れて、行のセルの値を確認することができることが、私はこれが

for (int i = 0; i < dataGridView1.Rows.Count; i++) 
    { 
     if (dataGridView1.Rows[i].Cells["currency"].FormattedValue.ToString() == "USD") 
     { 
      string tempval = dataGridView1.Rows[i].Cells["commission"].ToString(); 
      myCommission += double.Parse(dataGridView1.Rows[i].Cells["commission"].FormattedValue.ToString()) * (double.Parse(dataGridView1.Rows[i].Cells["price"].FormattedValue.ToString()) * UStoGB); 
     } 
     else if (dataGridView1.Rows[i].Cells["currency"].FormattedValue.ToString() == "EURO") 
     { 
      myCommission += double.Parse(dataGridView1.Rows[i].Cells["commission"].FormattedValue.ToString()) * (double.Parse(dataGridView1.Rows[i].Cells["price"].FormattedValue.ToString()) * EUtoGB); 
     } 
     else 
     { 
      myCommission += double.Parse(dataGridView1.Rows[i].Cells["commission"].FormattedValue.ToString()) * (double.Parse(dataGridView1.Rows[i].Cells["price"].FormattedValue.ToString())); 
     } 

    } 

は思わ使用して作業を得ることができたこと FormattedValueパラメータを指定せずにそれと Rows[i]を指定し、 Cells[i]ちょうど値に達していませんでした。 allowusertoaddrows機能を無効にして、最後の行を数えないようにする必要もあります。これは読み取り専用なので問題ありません。

casefor ... elseセクションを置き換えるになりますお返事のための

Mohgerthのおかげで、今、私は元々のデータソース上でそれらを実行しようとしましたが、

関連する問題