使用TextBox实时筛选ListBox

本文关键字:ListBox 筛选 实时 TextBox 使用 | 更新日期: 2023-09-27 18:29:58

我正在尝试用文本框realTime中的文本过滤列表框。

这是代码:

private void SrchBox_TextChanged_1(object sender, EventArgs e)
{
  var registrationsList = registrationListBox.Items.Cast<String>().ToList();
  registrationListBox.BeginUpdate();
  registrationListBox.Items.Clear();
  foreach (string str in registrationsList)
  {
    if (str.Contains(SrchBox.Text))
    {
      registrationListBox.Items.Add(str);
    }
  }
  registrationListBox.EndUpdate();
}

问题如下:

  1. 当我运行程序时,我得到这个错误:Object reference not set to an instance of an object

  2. 如果我按退格键,我的初始列表将不再显示。这是因为我的实际项目列表现在减少了,但我如何才能做到这一点?

你能给我指正确的方向吗?

使用TextBox实时筛选ListBox

仅从代码中很难推断,但我认为您的过滤问题来自不同方面:

a) 您需要ListBox上显示的数据的Model。您需要一个存放在某个地方的"物品"集合(DictionaryDataBaseXMLBinaryFileCollection),简而言之,就是某种商店

要在UI上显示数据,总是存储中选择数据,过滤并将其放在UI上。

b) 在第一个点之后,您的过滤代码可以看起来像这样(伪代码

var registrationsList = DataStore.ToList(); //return original data from Store
registrationListBox.BeginUpdate();
registrationListBox.Items.Clear();
if(!string.IsNullOrEmpty(SrchBox.Text)) 
{
  foreach (string str in registrationsList)
  {                
     if (str.Contains(SrchBox.Text))
     {
         registrationListBox.Items.Add(str);
     }
  }
}
else 
   registrationListBox.Items.AddRange(registrationsList); //there is no any filter string, so add all data we have in Store
registrationListBox.EndUpdate();

希望这能有所帮助。

这样的东西可能对你有用:

var itemList = registrationListBox.Items.Cast<string>().ToList();
if (itemList.Count > 0)
{
    //clear the items from the list
    registrationListBox.Items.Clear();
    //filter the items and add them to the list
    registrationListBox.Items.AddRange(
        itemList.Where(i => i.Contains(SrchBox.Text)).ToArray());
}

是的,这就是过滤的答案。(修改了一点)。我有一个文本文件中的信息。这就是对我有效的

FileInfo registrationsText = new FileInfo(@"name_temp.txt");
            StreamReader registrationsSR = registrationsText.OpenText();
            var registrationsList = registrationListBox.Items.Cast<string>().ToList();
            registrationListBox.BeginUpdate();
            registrationListBox.Items.Clear();
            if (!string.IsNullOrEmpty(SrchBox.Text))
            {
                foreach (string str in registrationsList)
                {
                    if (str.Contains(SrchBox.Text))
                    {
                        registrationListBox.Items.Add(str);
                    }
                }
            }
            else
                while (!registrationsSR.EndOfStream)
                {
                    registrationListBox.Items.Add(registrationsSR.ReadLine());
                }
            registrationListBox.EndUpdate();

似乎错误:

对象引用未设置为对象的实例

来自我代码中的其他地方,无法将手指放在上面。

如果可以,将所有内容存储在字典中,然后从那里填充。

public partial class myForm : Form
{
    private Dictionary<string, string> myDictionary = new Dictionary<string, string>();
//constructor. populates the items. Assumes there is a listbox (myListbox) and a textbox (myTextbox), named respectively
public myForm()
{
    InitializeComponent();
    myDictionary.Add("key1", "item1");
    myDictionary.Add("key2", "My Item");
    myDictionary.Add("key3", "A Thing");
    //populate the listbox with everything in the dictionary
    foreach (string s in myDictionary.Values)
        myListbox.Add(s);
}
//make sure to connect this to the textbox change event
private void myTextBox_TextChanged(object sender, EventArgs e)
{
    myListbox.BeginUpdate();
    myListbox.Items.Clear();
    foreach (string s in myDictionary.Values)
    {
        if (s.Contains(myListbox.Text))
            myListbox.Items.Add(s);
    }
    myListbox.EndUpdate();
}
}

我会这样做:

private List<string> registrationsList;
private void SrchBox_TextChanged_1(object sender, EventArgs e)
{
  registrationListBox.BeginUpdate();
  registrationListBox.Items.Clear();
  var filteredList = registrationList.Where(rl => rl.Contains(SrchBox.Text))
  registrationListBox.Items.AddRange();
  registrationListBox.EndUpdate();
}

只需记住在第一次填写列表框时填写registrationsList即可。

希望这能有所帮助。

这对我来说是一个非常困难的问题,但我找到了一个对我来说很好的解决方法(不那么简单)。

在aspx页面上:

<input id="ss" type="text" oninput="writeFilterValue()"/>
<asp:HiddenField ID="hf1" runat="server" Value="" ClientIDMode="Static" />

我需要HTML输入类型,因为"oninput"函数在经典的asp.net控件上不可用。writeFilterValue()函数会导致一个回发,该回发过滤给定ListBox的值(代码隐藏)。

我定义了两个javascript函数:

    <script type="text/javascript">
    function writeFilterValue() {
        var bla = document.getElementById("ss").value;
        $("#hf1").val(bla)
        __doPostBack();
    }
    function setTboxValue(s) {
        document.getElementById('ss').value = s;
        document.getElementById('ss').focus();
    }
</script>

现在,每当在输入框上键入某个字符时,您可以在代码隐藏上使用回发来捕获hf1值。在代码背后:

    If IsPostBack Then
        FiltraLbox(hf1.Value)
    End If

函数FiltraLbox(hf1.Value)更改Listbox的数据源,并重新绑定它:

Public Sub FiltraLbox(ByVal hf As String)
    If hf <> "" Then

    ' change datasource here, that depends on hf value,

        ListBox1.DataBind()
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "text", setTboxValue('" + hf + "');", True)
    End If
End Sub

最后,我调用函数setTboxValue(),它重写回发时丢失的输入文本值,并将重点放在它上

享受吧。