На сколько я понял, лишняя строка, которая появляется - это выделенная строка в CurrencyManager.
Я смог найти два подхода к решению этой проблемы:
- Отключить CurrencyManager в начале метода фильтрации по дереву
CurrencyManager currencyManager = (CurrencyManager)BindingContext [dataGridView1.DataSource];
currencyManager.SuspendBinding();
Отключение сделает недоступным некоторые возможности, например CurrentRow, CurrentCell и, возможно, еще что-то.
- Переключать выделение на одну из строк, которые должны быть видимыми.
dataGridView1.CurrentCell = this.dataGridView1[columnNumber, visibleRowNumber];
Однако, этот вариант не работает в случае, когда все строки должны быть скрыты.