Как искать один и тот же текст в разных строках в DataGridView? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть кнопка поиска, когда я набираю текстовое поле и нажимаю кнопку, он выполняет поиск в столбце «Бренд» в DataGridView.
Если я печатаю BMW, строка выбирается, однако, если янаберите несколько BMWs и нажмите кнопку еще раз, остальные строки не будут выбраны:

string searchValue = textBox1.Text;

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
try
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.Cells[1].Value.ToString().Equals(searchValue))
        {
            row.Selected = true;
            break;
        }
        dataGridView1.ClearSelection();
    }
}
catch (Exception exc)
{
    MessageBox.Show("Not found");
}

Ответы [ 3 ]

1 голос
/ 05 мая 2019

После установки свойства MultiSelect на True и SelectionMode на FullRowSelect, вы можете достичь этого.

dataGridView1.MultiSelect = true;
dataGridView1.SelectionMode = FullRowSelect:

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

if(row.Cells[1].Value.ToString().Equals(searchValue))
{
    row.Selected = true;
    //break; -- remove this one and try
}
0 голосов
/ 05 мая 2019

Это пример класса, который позволяет выполнять поиск в содержимом коллекции DataGridView.Rows , указывая критерии поиска и столбец, который является целью поиска.

Результаты поиска кэшируются, поэтому поиск повторяется только при изменении критериев поиска или индекса столбца.

Этот класс использует IEnumerable.GetEnumerator () , который возвращает объект, позволяющий выполнить итерацию коллекции.Метод MoveNext () используется для перемещения выделения к следующему элементу в списке результатов DataGridViewRow.
Когда последний элемент достигнут, перечислитель перемещается обратно к первому элементу с помощьюметод Reset () + MoveNext() (Reset()) устанавливает перечислитель в положение , начиная с , до первого элемента в коллекции, поэтому он указывает на нулевой элемент; MoveNext(), затем выдвиньте его вперед в первом положении).

Инициализируйте этот класс с объектом DataGridView, который является источником коллекции Rows:

var dgvSearcher = new DGVSearcher(dataGridView1);

Чтобы выполнить поиск, вызовите открытый метод Search(),указание критериев поиска (частичное содержимое ячейки), индекса столбца и параметра (bool selectRow), указывающего, следует ли выбирать строки.
Например, поиск строки "Some text", содержащейся в Cell[1]любой строки и выберите строку:

dgvSearcher.Search("Some text", 1, true);

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

Наглядный пример такого поведения:

DataGridView Row Search class

Класс DGVSearcher:

using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

internal class DGVSearcher
{
    DataGridView dgv = null;
    string m_SearchCriteria = string.Empty;
    int m_ColumnIndex = -1;
    IEnumerator<DataGridViewRow> m_enumerator = null;

    public DGVSearcher(DataGridView dataGridView) => this.dgv = dataGridView;

    private List<DataGridViewRow> cached { get; set; } new List<DataGridViewRow>();

    public bool Search(int cellIndex, string criteria, bool selectRow)
    {
        if (string.IsNullOrEmpty(criteria)) return false;
        bool result = true;
        if (criteria.Equals(this.m_SearchCriteria) && this.m_ColumnIndex == cellIndex) {
            if (!this.m_enumerator.MoveNext())
            {
                this.m_enumerator.Reset();
                this.m_enumerator.MoveNext();
            }
            SetSelectedRow(this.m_enumerator.Current as DataGridViewRow, selectRow);
        }
        else {
            this.m_SearchCriteria = criteria;
            this.m_ColumnIndex = cellIndex;
            result = RebuildCachedCollection(cellIndex);
        }
        return result;
    }

    private bool RebuildCachedCollection(int cellIndex)
    {
        bool result = false;
        if (cached.Count > 0) cached.Clear();
        cached = this.dgv.Rows.OfType<DataGridViewRow>()
                              .Where(r => r.Cells[cellIndex].FormattedValue.ToString()
                              .Contains(this.m_SearchCriteria)).ToList();
        if (cached.Count() > 0) {
            this.m_enumerator = cached.GetEnumerator();
            this.m_enumerator.MoveNext();
            SetSelectedRow(this.m_enumerator.Current as DataGridViewRow, true);
            result = true;
        }
        return result;
    }

    private void SetSelectedRow(DataGridViewRow row, bool setSelected)
    {
        row.Selected = setSelected;
        this.dgv.FirstDisplayedScrollingRowIndex = row.Index;
        if (!setSelected) this.dgv.CurrentCell = this.dgv[0, row.Index];
    }
}
0 голосов
/ 05 мая 2019

Удалить оператор разрыва из вашего кода.Поиск не будет продолжен после поиска одной строки, если вы этого не сделаете.

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