【问题标题】:Performing Calculation on Filtered DataGridView对过滤后的 DataGridView 执行计算
【发布时间】:2013-03-19 19:16:39
【问题描述】:

我有一个从 XML 文件创建的数据集填充的 Datagridview。这部分有效,我可以让数据集的全部内容显示在数据网格中。我添加了根据日期和已售标志过滤 datagridview 的功能。当您循环浏览日期时,这也可以正常工作,因为 datagridview 会更新。但是我需要对“过滤”的数据网格视图进行一些计算。这些计算需要将各种货币转换为英镑。因此,在对最好的方法进行了一些研究之后,我决定遍历可见的 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());
                }

            }

【问题讨论】:

  • 我最初尝试在数据源上执行它们,但无法弄清楚如何仅操作过滤后的数据而不是数据源中的所有数据。目前仍在努力编程,所以还有很多东西要学……谢谢你的指点。
  • 使用 DataTable.DefaulView,它假设是您的过滤结果并进行计算,例如 DataTable.DefaultView.ToTable().Compute(SUM(IIF(currency = 'USD', Commission * price * whatewer, IIF(currency = 'EURO', 佣金 * price * whatewer2)))) 等等。您还可以使用 LINQ 进行计算。

标签: c# datagridview


【解决方案1】:

我设法让这个工作使用

    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 感谢您的回复,看起来将 for...else 部分替换为 case 现在其工作方式为

【讨论】:

    【解决方案2】:

    一些注释的小改动:

    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 导入可能对列名进行了某些操作。

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

    【讨论】:

    • 感谢 Mohgerth,在我登录查看帖子之前,我刚刚让它工作了 :),但它不会让我再发布 6 个小时的问题的答案。感谢您花费的时间,并将考虑将案例陈述纳入我的解决方案。我会尽快发布...谢谢
    • 应该是foreach中的DataGridViewRow,而不是DataRow。
    • 是的。相应更新。
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多