Поиск ListViewItem в VirtualMode
У меня возникли проблемы с поиском в ListView при использовании VirtualMode. ListView заполняет просто найти с помощью события RetrieveVirtualItem.
У меня есть текстовое поле и кнопка "Поиск" в моей форме.
private void btnSearch_Click(object sender, EventArgs e)
{
listViewFields.FindItemWithText(txtSearch.Text);
}
Я обработал событие SearchForVirtualItem, которое ищет текст в моей коллекции и устанавливает индекс для свойства Index аргументов события.
private void listViewFields_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
{
e.Index = collection.IndexOf(e.Text);
}
Значение e.Index действительно устанавливается в ожидаемое значение, но тогда в моем ListView ничего не происходит.
2 ответа
Значение e.Index действительно устанавливается в ожидаемое значение, но тогда в моем ListView ничего не происходит.
FindItemWithText
Метод делает именно то, что говорит - находит и возвращает первый ListViewItem, который начинается с указанного текстового значения.
Чтобы что-то произошло в представлении списка, вы должны сделать что-то с возвращенным элементом. Например:
var item = listViewFields.FindItemWithText(txtSearch.Text);
if (item != null)
{
listViewFields.FocusedItem = item;
item.Selected = true;
item.EnsureVisible();
}
легко, вам нужен другой список, чтобы сохранить найденный индекс в материале, который вы искали из исходного списка. Мой список 2 является результатом , а мой исходный список - m_sTable1_DataList.
private List<int> result = null;
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if(e.KeyChar == '\r')
{
string sSearchValue = textBox1.Text.TrimEnd();
if (sSearchValue.Length > 0)
{
listViewDB1.FindItemWithText(sSearchValue);
//Select the item found and scroll it into view.
}
}
}
private void listViewDB1_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
{
result = Enumerable.Range(0, m_sTable1_DataList.Count)
.Where(i => m_sTable1_DataList[i].Contains(textBox1.Text.ToString().TrimEnd()))
.ToList();
if (result.Count > 0)
listViewDB1.VirtualListSize = result.Count;
else
{
result = null;
this.listViewDB1.VirtualListSize = 0;
}
}
private void listViewDB1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (result != null)
e.Item = new ListViewItem(m_sTable1_DataList[result[e.ItemIndex]]);
else
e.Item = new ListViewItem(m_sTable1_DataList[e.ItemIndex]);
}
i have a reset button to come back to the orginal list and VirtualListSize.
private void Resetbutton_Click(object sender, EventArgs e)
{
listViewDB2.Items.Clear();
textBox1.Text = "";
textBox1.Refresh();
result = null;
this.listViewDB1.VirtualListSize = nCountRow;
}