如何在DataGridView的不同行中搜索相同的文本?

时间:2019-05-05 12:25:18

标签: c# winforms datagridview

我有一个搜索按钮,当我在文本框中键入内容并单击“按钮”时,它将在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 个答案:

答案 0 :(得分:1)

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
}

答案 1 :(得分:0)

从代码中删除break语句。如果找不到,将不会继续搜索找到一行。

答案 2 :(得分:0)

这是一个示例类,它允许搜索DataGridView.Rows集合的内容,指定搜索条件和作为搜索目标的Column。

将缓存搜索结果,因此仅当搜索条件或列索引更改时才重复搜索。

此类使用IEnumerable.GetEnumerator(),它返回允许迭代集合的对象。 MoveNext()方法用于将选择内容移至DataGridViewRow结果列表中的下一个元素。
当到达最后一个元素时,使用Reset()方法+ MoveNext()Reset()将枚举器移回第一个元素(MoveNext()将枚举器设置为 starting 位置,在集合中第一个元素之前,因此它指向空元素; var dgvSearcher = new DGVSearcher(dataGridView1); 然后将其向前推到第一个位置)。

使用作为Rows集合源的DataGridView对象初始化此类:

Search()

要执行搜索,请调用公共的 bool selectRow 方法,指定搜索条件(单元格的部分内容),列索引和参数("Some text" ),指示是否应选择行。
例如,搜索任何行的Cell[1]中包含的字符串dgvSearcher.Search("Some text", 1, true); 并选择行:

DGVSearcher

首次执行此搜索时,在第一位置显示满足条件的第一行。如果使用相同条件重复搜索,则将下一行移到第一位置,如果指定则选择下一行。

此行为的直观示例:

DataGridView Row Search class

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]; } } 类:

{{1}}