-1

使用 VirtualMode 时,我在 ListView 中进行搜索时遇到了一些麻烦。ListView 填充只是使用 RetrieveVirtualItem 事件查找。

我的表单上有一个文本框和“搜索”按钮。

private void btnSearch_Click(object sender, EventArgs e)
{
    listViewFields.FindItemWithText(txtSearch.Text);
}

我已经处理了 SearchForVirtualItem 事件,该事件在我的集合中查找文本并将索引设置为事件 args 的 Index 属性。

private void listViewFields_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
{
        e.Index = collection.IndexOf(e.Text);
}

e.Index 的值确实设置为预期值,但在我的 ListView 中没有任何反应。

4

2 回答 2

0

e.Index 的值确实设置为预期值,但在我的 ListView 中没有任何反应。

FindItemWithText方法完全按照它所说的进行 - 查找并返回以指定文本值开头的第一个 ListViewItem。

为了在您的列表视图中发生某些事情,您必须对返回的项目做一些事情。例如:

var item = listViewFields.FindItemWithText(txtSearch.Text);
if (item != null)
{
    listViewFields.FocusedItem = item;
    item.Selected = true;
    item.EnsureVisible();
}
于 2016-06-28T18:07:18.387 回答
0

您很容易需要另一个列表来将找到的索引保存到您从原始列表中搜索的内容中。我的 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;
    }
于 2021-09-06T09:13:50.477 回答