Поскольку вы уже перебираете строки с 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);
}
}