2009-03-29 3 views
2

HIПоиск в A ListBox

Я пытаюсь разместить текстовое поле для поиска в спискеBox. У меня есть TextBox: SearchText с этим кодом:

private void SearchText_TextChanged(object sender, EventArgs e) 
{ 
    int i = listBox3.FindString(SearchText.Text); 
    listBox3.SelectedIndex = i; 
} 

и ListBox на нагрузку у меня есть этот код

List<string> str = GetListOfFiles(@"D:\\Music\\massive attack - collected");   
listBox3.DataSource = str; 
listBox3.DisplayMember = "str"; 

и на SelectedIndexChanged:

private void listBox3_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    player1.URL = listBox3.SelectedItem.ToString(); // HERE APPEAR THE ERROR "Object reference not set to an instance of an object." 

    // provaTxt.Text = listBox3.SelectedValue.ToString(); 
} 

Когда я записываю в SeachText, чтобы найти песни, я получаю сообщение об ошибке («Ссылка объекта не установлена ​​на экземпляр объекта.») в строке selectedIndexChanged из ListBox. Знаете ли вы еще один способ найти в listBox как мой случай? Спасибо за вашу долю. С уважением

+0

Полный пример добавил; Я * думаю * он показывает все из ваших комментариев ... –

ответ

2

Похоже, элемент не найден, поэтому SelectedItem было null; попробуйте использовать:

player1.URL = Convert.ToString(listBox3.SelectedItem); 

Я считаю, что это обращается с нулевым случаем (altenatively, сначала проверяет значение null).

Я также был бы соблазн посмотреть в базовый список:

List<string> items = (List<string>)listbox3.DataSource; 
listbox3.SelectedIndex = items.FindIndex(s => s.StartsWith(searchFor)); 

Например:

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
class MyForm : Form 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new MyForm()); 
    } 

    ListBox listbox; 
    TextBox textbox; 
    CheckBox multi; 
    public MyForm() 
    { 
     textbox = new TextBox { Dock = DockStyle.Top }; 
     List<string> strings = new List<string> { "abc", "abd", "abed", "ab" }; 
     listbox = new ListBox { Dock = DockStyle.Fill, DataSource = strings }; 
     textbox.KeyDown += textbox_KeyDown; 
     Controls.Add(listbox); 
     Controls.Add(textbox); 
     listbox.SelectedIndexChanged += listbox_SelectedIndexChanged; 
     listbox.SelectionMode = SelectionMode.MultiExtended; 
     multi = new CheckBox { Text = "select multiple", Dock = DockStyle.Bottom }; 
     Controls.Add(multi); 
    } 

    void listbox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Text = Convert.ToString(listbox.SelectedItem); 
    } 

    void textbox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Return) 
     { 
      string searchFor = textbox.Text; 
      List<string> strings = (List<string>)listbox.DataSource; 
      if (multi.Checked) 
      { 
       for (int i = 0; i < strings.Count; i++) 
       { 
        listbox.SetSelected(i, strings[i].Contains(searchFor)); 
       } 
      } 
      else 
      { 
       listbox.ClearSelected(); 
       listbox.SelectedIndex = strings.FindIndex(
        s => s.Contains(searchFor)); 
      } 
     } 
    } 
} 
+0

Вы можете проверить нулевые или пустые строки с помощью if (! String.IsNullOrEmpty (someString)) – DOK

+0

@DOK: Да, но SelectedItem - это объект, а не строка. –

+0

Привет, Марк, первое спасибо за вашу поддержку, я изменил, как вы советуете мне, когда я записываю на SearchText, ошибка больше не появляется, но последняя не может ничего искать. Изменено также StartWith with Содержит, но ничего. Я могу это выдумать? Спасибо, но – JayJay

Смежные вопросы