如何正确汇总datagridview所选单元格

时间:2019-03-05 17:28:13

标签: c# winforms datagridview

它正在工作,但是不正确 ...如果从上到下选择总和正确,但是从上到下选择总和不是

private void SalesGridView_SelectionChanged(object sender, EventArgs e)
{
    float sumNumbers = 0;
    for (int i = 0; i < SalesGridView.SelectedCells.Count; i++)
    {
        if (!SalesGridView.SelectedCells.Contains(SalesGridView.Rows[i].Cells["TotalBillColumn"]))
        {
            float nextNumber = 0;


            if (float.TryParse(SalesGridView.SelectedCells[i].FormattedValue.ToString(), out nextNumber))
                sumNumbers += nextNumber;


           label1.Text = "selected value " + sumNumbers;
            label2.Text = "nr selected cells " + SalesGridView.SelectedCells.Count.ToString();
        }
        else
        {

        }
    }
}

2 个答案:

答案 0 :(得分:0)

尝试以下代码:

private void SalesGridView_SelectionChanged(object sender, EventArgs e)
{
    float sumNumbers = 0;
    for (int i = 0; i < SalesGridView.SelectedCells.Count; i++)
    {
        var selectedCell = SalesGridView.SelectedCells[i];
        if (selectedCell.ColumnIndex == SalesGridView.Columns["TotalBillColumn"].Index)
        {
            float nextNumber = 0;

            if (float.TryParse(selectedCell.FormattedValue.ToString(), out nextNumber))
                sumNumbers += nextNumber;
        }
    }

    label1.Text = "selected value " + sumNumbers;
    label2.Text = "nr selected cells " + SalesGridView.SelectedCells.Count.ToString();
}

对不起,对于较晚的解释,当我写该答案时没有时间详细说明您的实际问题是什么,只给了您应该可行的解决方案。

您的问题可以在那条线上

if (!SalesGridView.SelectedCells.Contains(SalesGridView.Rows[i].Cells["TotalBillColumn"]))

准确地说,以下陈述会给您带来错误的结果:

SalesGridView.Rows[i]

您将收到不想要的结果,因为i不符合您对Rows的索引的要求,因此,让我们看一下您在for循环中写的内容。

for (int i = 0; i < SalesGridView.SelectedCells.Count; i++)

您的for循环尝试枚举SelectedCells中的SalesGridView

因此,假设您选择了5个单元格,而不是for循环,其枚举从0到独占5,所以我将是0, 1, 2, 3 or 4

现在,让我们再次检查一下我之前提到的有问题的陈述:

SalesGridView.Rows[i]

例如,SelectedCell是否与i = 0对应,而Rows[0]是否对应。

您的SelectedCells可以是任何行,并且您的for循环将始终从0枚举到SelectedCells.Count,但是您对SalesGridView.Rows[i]的声明将始终尝试得到具有给定索引Row的{​​{1}}。

例如,

  1. 您在i行和2行中选择6个单元格。
  2. 7将有SelectedCells.Count
  3. 您枚举2,从SelectedCells到独占0,因此2将是i0
  4. 在循环中,您尝试通过调用1来访问i的行
  5. 正如在SalesGridView.Rows[i] 3.中提到的
  6. 将仅是i0,但是我选择了1行的2单元,并且6

答案 1 :(得分:0)

export const spyOnFunction = <T>(obj: T, func: keyof T) => {
  const spy = jasmine.createSpy(func as string);
  spyOnProperty(obj, func, 'get').and.returnValue(spy);

  return spy;
};

并使用TryParse(如果您要安全起见):

import * as mod from 'my/module';
//...
spyOnFunction(mod, 'myFunc').and.returnValue('myMockReturnValue');