我有一个搜索按钮,当我在文本框中键入内容并单击“按钮”时,它将在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");
}
答案 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
首次执行此搜索时,在第一位置显示满足条件的第一行。如果使用相同条件重复搜索,则将下一行移到第一位置,如果指定则选择下一行。
此行为的直观示例:
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}}