【问题标题】:Getting the sum of a column's cells from visible rows in datagridview从datagridview中的可见行获取列单元格的总和
【发布时间】:2018-01-09 13:30:45
【问题描述】:

我有一个数据网格视图,我可以在其中不可见或隐藏一些行,在这个过程中,我应该得到第 6 列单元格的总和(仅来自可见行)我在上下文菜单项中编写的代码单击事件给我一个例外说:“输入字符串的格式不正确。”在这行代码中:

count += Convert.ToInt32(addSellItemsDgv.Rows[row.Index].Cells[6].Value.ToString());  

我的上下文菜单项点击事件代码:

private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow row in addSellItemsDgv.SelectedRows)
    {
        CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[addSellItemsDgv.DataSource];
        currencyManager1.SuspendBinding();
        addSellItemsDgv.CurrentCell = null;
        row.Visible = false;
    }
    addSellItemsDgv.Refresh();
    int count = 0;
    if (addSellItemsDgv.Rows.GetRowCount(DataGridViewElementStates.Visible) > 0)
    {
        foreach (DataGridViewRow row in addSellItemsDgv.Rows)
        {
            if (row.Visible == true)
            {
                count += Convert.ToInt32(addSellItemsDgv.Rows[row.Index].Cells[6].Value.ToString());
            }
        }
        addSellTtlCostLbl.Text = count.ToString();
    }
    else
    {
        addSellTtlCostLbl.Text = "0";
    }
}

【问题讨论】:

  • 您可能有一个空白行。在尝试将值转换为 int32 之前,请检查 Cell.Value 是否为“null”。
  • @peeebeee 它有一个值,所有单元格都有值
  • 在调试器中运行,然后在遇到异常时检查您尝试转换的值。
  • 除非您先拥有数据,否则无法将数据绑定到数据网格。为什么不从用于填充数据网格的数据中计算您需要的值,而不是填充数据网格然后尝试从中读取?

标签: c# winforms datagridview sum


【解决方案1】:

虽然我们在这里遗漏了更多上下文,但我猜Convert.ToInt32 接收到一个字母数字值,或者一个超过 Int32 的值。请仔细检查您传递给Convert.ToInt32 的字符串值,并事先尝试Trim 字符串。

另外,我建议使用Int32.TryParse。这将帮助您防止此异常并验证用户输入。

【讨论】:

    【解决方案2】:

    我通过转换 ToDouble 而不是 ToInt32 并使用行对象而不是 Rows[row.Index] 来解决它:)

    private void toolStripMenuItem2_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in addSellItemsDgv.SelectedRows)
        {
            CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[addSellItemsDgv.DataSource];
            currencyManager1.SuspendBinding();
            addSellItemsDgv.CurrentCell = null;
            row.Visible = false;
        }
        addSellItemsDgv.Refresh();
        double count = 0;
        if (addSellItemsDgv.Rows.GetRowCount(DataGridViewElementStates.Visible) > 0)
        {
            foreach (DataGridViewRow row in addSellItemsDgv.Rows)
            {
                if (row.Visible == true)
                {
                    count += Convert.ToDouble(row.Cells[6].FormattedValue.ToString());
                }
            }
            addSellTtlCostLbl.Text = count.ToString();
        }
        else
        {
            addSellTtlCostLbl.Text = "0";
        }
    }
    

    【讨论】:

    • 很高兴你已经解决了。在点击“转换”之前检查无效数字仍然是一个好习惯 - TryParse 是一个很好的机制。
    • @peeebeee 我会记住这一点以便进一步练习:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多