Вы должны связать данные и выполнять свои операции над самими данными, а не с пользовательским интерфейсом.Вы можете сделать следующее:
Public Class Form1
Private allData As IEnumerable(Of Data) ' all your data
Private filtered As IEnumerable(Of Data) ' filtered for logical and display purposes
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
allData = Enumerable.Range(0, 32).Select(Function(i) New Data() With {.Value = i})
updateFilteredNumbers(Function(d) True) ' filtered list initially identical to all
End Sub
Private Sub HideButton_Click(sender As Object, e As EventArgs) Handles HideButton.Click
updateFilteredNumbers(Function(d) False)
End Sub
Private Sub ShowButton_Click(sender As Object, e As EventArgs) Handles ShowButton.Click
updateFilteredNumbers(Function(d) True)
End Sub
Private Sub EvenButton_Click(sender As Object, e As EventArgs) Handles EvenButton.Click
updateFilteredNumbers(Function(d) d.Value Mod 2 = 0)
End Sub
Private Sub OddButton_Click(sender As Object, e As EventArgs) Handles OddButton.Click
updateFilteredNumbers(Function(d) d.Value Mod 2 = 1)
End Sub
Private Async Sub updateFilteredNumbers(predicate As Func(Of Data, Boolean))
' perform filtering asynchronously, then update datasource on UI thread
filtered = Await Task.Factory.StartNew(Function() allData.Where(predicate).ToList())
datagrid.DataSource = filtered
End Sub
End Class
Public Structure Data ' Class to represent your data. Simple for this example
Public Property Value As Integer
End Structure
В этом примере можно скрыть все, показать все или показать только нечетные или четные значения.Вы можете обновить «отфильтрованную» коллекцию и просто обновить источник данных.