Как суммировать данные в выбранной ячейке ПРАВИЛЬНО - PullRequest
0 голосов
/ 05 марта 2019

работает, но не правильно ... если выбрать сверху вниз, это где-то правильная сумма, но выбор сверху вниз не суммирует

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 голосов
/ 05 марта 2019
private void button1_Click(object sender, EventArgs e)
{
    double result = 0;
    foreach (DataGridViewCell  cell in dataGridView1.SelectedCells)
    {
        result = result + double.Parse(cell.Value.ToString());
    }
    label2.Text = result.ToString();

}

и с TryParse, если вы хотите перейти на безопасную сторону:

private void button1_Click(object sender, EventArgs e)
{
    double result = 0;
    double nextNumber = 0;
    foreach (DataGridViewCell  cell in dataGridView1.SelectedCells)
    {
        if (double.TryParse(cell.Value.ToString(), out result)) 
        {
            nextNumber += result;
            label2.Text = nextNumber.ToString();
        }
    }
}
0 голосов
/ 05 марта 2019

Попробуйте следующий код:

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 с указанным индексом i.

Так, например:

  1. Вы выбираете 2 ячеек в строке 6 и 7.
  2. SelectedCells.Count будет иметь 2
  3. Вы перечисляете SelectedCells, начиная с 0 до исключительного 2, поэтому i будет 0 или 1
  4. Внутри вашего цикла вы пытаетесь получить доступ к строке с помощью i, вызывая SalesGridView.Rows[i]
  5. , как указано в пункте 3. i, будет только 0 или 1, но я выбрал 2 ячейки строк 6 и 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...