Поиск в datagridview не отображает правильный ответ - PullRequest
0 голосов
/ 04 октября 2018

Когда нажата кнопка поиска, я пытаюсь подсчитать, сколько результатов имеют одно и то же «имя пользователя», а затем суммировать их «заработанное» (заработанное является десятичным числом)

private void button5_Click(object sender, EventArgs e)
    {
        string searchValue = textBox5.Text;
        int rowIndex = 1; 

        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        try
        {
            bool valueResult = true;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Cells[1].Value.ToString().Equals(searchValue))
                {
                    rowIndex = row.Index;
                    dataGridView1.Rows[1].Selected = true;
                    rowIndex++;
                    valueResult = false;
                    var count = this.dataGridView1.Rows.Cast<DataGridViewRow>()
                   .Count(roww => row.Cells[1].Value.ToString() == searchValue);
                    this.textBox6.Text = count.ToString();
                }
            }
            if (valueResult != false)
            {
                MessageBox.Show("Record is not avalable for this Name: " + textBox5.Text, "Not Found");
                return;
            }
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
    }

1) Но по какой-то причинеtextbox6 будет отображать последнее число в столбце «id» независимо от имени пользователя, которого искали. 2) Кроме того, я не могу понять, как суммировать каждую ячейку в «заработанном» для этого конкретного пользователя, которого искали

[Пример представления данных из MySql] 1

Я все еще новичок в c #

1 Ответ

0 голосов
/ 04 октября 2018

Поскольку вы уже перебираете строки с foreach, нет необходимости пересчитывать количество совпадений каждый раз внутри foreach.Вместо этого вы можете увеличить счетчик и добавить к заработанной сумме все подходящие строки.

Причина, по которой textbox6, по-видимому, имеет значение столбца «id» последней строки (который фактически являлся счетчиком всех строк в сетке), связана с условием Count:

.Count(roww => row.Cells[1].Value.ToString() == searchValue)

, который должен быть:

.Count(roww => roww.Cells[1].Value.ToString() == searchValue)

Если он равен roww => row и находится в условии if, он возвращает количество всех строк, а не только совпадающих строк.Но опять же, наличие .Count не нужно.

Вот модифицированная версия, которая перебирает строки и увеличивает счетчик и добавляет к заработанному итогу строки, которые соответствуют критериям выбора:

    private void button5_Click(object sender, EventArgs e)
    {
        string searchValue = textBox5.Text;

        dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        try
        {
            decimal earnedTotal = 0;
            int matches = 0;

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if(!row.IsNewRow)
                {
                    if((string)row.Cells[1].Value == searchValue)
                    {
                        row.Selected = true;

                        decimal earned;
                        if (decimal.TryParse((string)row.Cells[2].Value, out earned))
                            earnedTotal += earned;

                        matches++;
                    }
                    else
                    {
                        row.Selected = false;
                    }
                }
            }

            if(matches == 0)
                MessageBox.Show("Record is not avalable for this Name: " + textBox5.Text, "Not Found");

            textBox6.Text = matches.ToString();
            txtEarnedTotal.Text = earnedTotal.ToString();
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...