在Filtered DataGridView上执行计算

时间:2012-01-16 21:09:16

标签: c# datagridview

我有一个Datagridview,我从一个XML文件创建的数据集填充。这部分工作,我可以得到数据集的全部内容显示在数据网格中。我有额外的功能来根据日期和售出标志过滤datagridview。这也可以正常工作,因为在循环执行日期时datagridview会更新。但是我需要对“过滤后的”datagridview进行一些计算。这些计算需要将各种货币转换为GBP。因此,在对最佳方法进行一些研究之后,我决定遍历可见的datagridview并测试每个可见的。这是我提出的代码。不幸的是,在运行它时,所有测试都失败了,并且它尝试执行else子句,然后失败并显示“输入字符串格式不正确”异常。然而,我不认为这是问题,因为我会关注价格和货币价值并且他们“在当前情境中不存在”......现在我陷入困境并希望得到一些帮助。也许我正在走错路......

由于

哈利

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

            }

2 个答案:

答案 0 :(得分: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导入可能对列的名称做了些什么。

无论哪种方式都可以放入断点并查看行单元格的值

答案 1 :(得分: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功能,以便它不计算最后一行。这不是问题,因为它是readonly。

Mohgerth感谢您的回复将使用for取代else ... case部分,现在它的工作为