2012-04-02 4 views
3

Я пытаюсь отфильтровать список с текстом из текстового поля realTime.Фильтр ListBox с TextBox в реальном времени

Вот код:

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. Если я ударил забой, мой первоначальный список больше не отображается. Это связано с тем, что мой фактический список предметов теперь сокращен, но как я могу это достичь?

Можете ли вы указать мне правильное направление?

+0

вы пытались с помощью (! IsPostBack) проверки, если это не пост-обратно –

+1

Вам нужно сохранить содержимое списка в отдельном '' Список так что Items.Clear() Дон» t оставить вас с пустым списком. NRE не так очевидна. Кастинг в строку не обязательно работает, если исходные элементы не являются строками. Всегда используйте ToString(). –

+1

@COLDTOLD: Довольно уверен, что это вопрос WinForms ... –

ответ

5

Это трудно вычитать только из кода, но я предположить вашей проблемы фильтрации рожденной от различных аспектов:

а) Вам нужно Model данных, показанных на ListBox. Вам нужен сборник «Предметы», который вы где-то держите (Dictionary, DataBase, XML, BinaryFile, Collection), своего рода Магазин вкратце.

Для отображения данных на пользовательском интерфейсе вы всегда выбрать данные из этого магазина, фильтровать его и положить его на UI.

б) После первой точки коды фильтрации могут выглядеть следующим образом (псевдокод)

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

Надеется, что это помогает.

+0

Да, это был ответ на фильтрацию. (изменено немного) – observ

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

ListBox, а не ListView. –

+0

@ HansPassant: Спасибо. Как-то я пропустил это, даже когда я несколько раз набирал 'registrationListBox' ... :) –

+0

Хе-хе, я знаю это чувство :) –

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

кажется, что ошибка:

Object reference not set to an instance of an object

находится где-то еще в моем коде, не может положить палец на нем.

0

Если возможно, храните все в словаре и просто заполняйте его оттуда.

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(); 
} 
} 
Смежные вопросы