Поиск 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;
    }
Другие вопросы по тегам