2012-01-16 55 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部分现在它的工作作为