2012-01-16 95 views
0

我有一個Datagridview,我從一個XML文件創建的數據集填充。這部分工作,我可以讓數據集的全部內容顯示在數據網格中。我有添加的功能來過濾基於日期和銷售標誌的datagridview。這也可以正常工作,因爲在循環訪問日期時datagridview會更新。不過,我需要對「過濾的」datagridview進行一些計算。這些計算需要將各種貨幣轉換爲英鎊。因此,在對最佳方式進行一些研究之後,我決定遍歷可見的datagridview並測試每個可見的。這是我想到的代碼。不幸的是,當運行它時,所有的測試都失敗了,它嘗試執行else子句,然後失敗,輸入字符串的格式不正確。不過,我不認爲這是問題,因爲我在價格和貨幣價值觀看,他們「不存在於當前的背景下......」現在我堅持,並希望得到一些幫助。也許我去這個錯誤的方式...對篩選的DataGridView執行計算

感謝

哈利

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 2012-01-17 07:46:15

+0

使用DataTable.DefaulView,它假設您的過濾結果並進行計算,如DataTable.DefaultView.ToTable()。Compute(SUM(IIF(currency ='USD',commission * price * whatewer,IIF(currency = '歐元',佣金*價格* whatewer2))))等等。你也使用LINQ來做你的計算。 – pistipanko 2012-01-17 07:56:52

回答

0

一點點改變有一些注意事項:

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

不,這是一個答案更好,但將其更改爲foreach將允許您在行上放置一個表以確定列的確切名稱。列名可能是大小寫敏感的,或者XML導入可能已經對列的名稱做了些什麼。

無論哪種方式,能夠把一個斷點,看看行單元格的值

+0

感謝Mohgerth,在我登錄查看帖子之前,我剛剛得到了它的工作:)但它不會讓我發佈對我的問題的答案另外6個小時。我很欣賞你所採取的時間,並會考慮將案例陳述納入我的解決方案。我會盡快發佈......謝謝 – user1152667 2012-01-16 22:37:32

+1

它假設是一個DataGridViewRow在foreach中,而不是DataRow。 – pistipanko 2012-01-17 07:58:50

+0

是的。相應更新。 – Mohgeroth 2012-01-17 13:53:08

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功能,以便它不會計算最後一行。這不是一個問題,因爲它是隻讀的。

Mohgerth感謝您的回覆看起來與case更換for ... else部分現在它的工作作爲