Это пример класса, который позволяет выполнять поиск в содержимом коллекции 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);
Когда этот поиск выполняется впервые, первая строка, которая удовлетворяет критериям, отображается в первой позиции.Если поиск повторяется с использованием тех же критериев, следующая строка перемещается на первую позицию и выбирается, если указано.
Наглядный пример такого поведения:
Класс 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];
}
}