从datagridview中的可见行中获取列的单元格的总和

时间:2018-01-09 13:30:45

标签: c# winforms datagridview sum

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

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

2 个答案:

答案 0 :(得分:0)

尽管我们在这里缺少更多的上下文,我想Convert.ToInt32要么接收字母数字值,要么接收超过Int32的值。请仔细检查您传递给Convert.ToInt32的字符串值,并事先尝试Trim字符串。

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

答案 1 :(得分:0)

我通过转换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";
    }
}