Поиск строки в DataGridView и сохранение видимости только результата - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть текстовое поле поиска в форме, которая использует -match.Write-Host показывает положительный результат, когда поиск совпадает, но DataGridView скрывает все.

Я пробовал 2 решения, но безуспешно;оба возвращают "МАТЧ !!!"но все строки становятся невидимыми, что неожиданно:

1-й подход:

foreach ($row in $DataGridView1.Rows) {
    foreach ($cell in $row.Cells) {
        if ($cell.Value.ToString() -match ($searchTextBox.Text)) {
            $DataGridView1.Rows[$row.Index].Visible = $true
            Write-Host "MATCH!!!"
        } else {
            $DataGridView1.Rows[$row.Index].Visible = $false
        }
    }
}

2-й подход:

for ($i = 0; $i -lt $DataGridView1.RowCount; $i++) {
    for ($j = 0; $j -lt $DataGridView1.ColumnCount; $j++) {
        $CurrentCell = $DataGridView1.Rows[$i].Cells[$j]
        if ($CurrentCell.Value.ToString() -match ($searchTextBox.Text)) {
            $DataGridView1.Rows[$i].Visible = $true
            Write-Host "MATCH!!!"
        } else {
            $DataGridView1.Rows[$i].Visible = $false
        }
    }
}

Похоже, оба кода выполняют $DataGridView1.Rows[$i].Visible = $false каждыйвремя.

1 Ответ

0 голосов
/ 22 сентября 2018

Внутренние циклы обоих ваших подходов определяют видимость строки для каждой ячейки в отдельности.Если только последняя ячейка в строке не приведет к совпадению, строка в итоге будет скрыта, даже если совпадение было найдено в другой ячейке ранее.

То, что вы на самом деле хотите, это установить строку видимой, еслисовпадение было найдено в любой из ячеек в строке, поэтому вам необходимо запомнить, найдено ли совпадение в текущей строке, и установить видимость после обработки всех ячеекстрока.

Измените внутренний цикл на что-то вроде этого:

$found = $false
foreach ($cell in $row.Cells) {
    if ($cell.Value.ToString() -match ($searchTextBox.Text)) {
        $found = $true
        Write-Host "MATCH!!!"
        break
    }
}
$DataGridView1.Rows[$row.Index].Visible = $found

, и он должен делать то, что вы хотите.

Дополнительное break в условииоптимизация производительности.Когда совпадение найдено, нет необходимости проверять оставшиеся ячейки строки, поэтому вы можете пропустить оставшуюся часть цикла, установить видимость и перейти к следующей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...