使用TextBox实时过滤ListBox

时间:2012-04-02 20:57:17

标签: c# winforms list textbox listbox

我正在尝试使用文本框中的文本过滤列表框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. 如果我点击退格键,我的初始列表将不再显示。这是因为我的实际物品清单现在减少了,但我怎样才能实现这个目标呢?

  3. 你能指出我正确的方向吗?

6 个答案:

答案 0 :(得分:6)

很难从代码中扣除,但我推测从不同方面产生的过滤问题:

a)您需要Model上显示的ListBox数据。你需要一个“物品”的集合,你在某处(DictionaryDataBaseXMLBinaryFileCollection),某种存储简而言之。

要在用户界面上显示数据,您始终从该商店中选择数据,过滤它并将其放在用户界面上。

b)在第一点之后,您的过滤代码可能如下所示( a pseudocode

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();

希望这有帮助。

答案 1 :(得分:0)

这样的事可能适合你:

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());
}

答案 2 :(得分:0)

是的,这是过滤的答案。 (修改了一下)。我在文本文件中有信息。这对我有用

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();

似乎错误:

  

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

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

答案 3 :(得分:0)

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

with tags

答案 4 :(得分:0)

我会这样做:

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。

希望这有帮助。

答案 5 :(得分:0)

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

aspx页面上的

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

由于“ oninput”功能,我需要HTML输入类型,这在经典的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(),该函数重写回发时丢失的输入文本值,并将重点放在该文本上。

享受吧。