2009-03-29 9 views
2

HIRechercher dans un ListBox

J'essaie de mettre une zone de texte pour rechercher dans un listBox. J'ai une zone de texte: SearchText avec ce code:

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

et un ListBox sur la charge que j'ai ce code

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

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

Quand j'écris dans le SeachText pour trouver une chanson, je reçois une erreur ("Référence d'objet non définie sur une instance d'un objet.") dans la ligne selectedIndexChanged de la ListBox. Savez-vous un autre moyen de trouver dans un listBox comme mon cas? Merci pour votre partage. Nice Regards

+0

Exemple complet ajouté; Je * pense * cela montre tout de vos commentaires ... –

Répondre

2

Il semble que l'élément n'a pas été trouvé, alors SelectedItem était null; essayez d'utiliser:

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

Je crois que cela gère le cas nul (altenativement, test de null en premier).

Je serais également tenté de regarder dans la liste sous-jacente:

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

Par exemple:

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

Vous pouvez vérifier les chaînes vides ou vides en utilisant if (! String.IsNullOrEmpty (someString)) – DOK

+0

@DOK: Oui, mais SelectedItem est un objet, pas une chaîne. –

+0

Salut Marc, d'abord merci pour votre soutien, j'ai changé comme vous me conseillez quand j'écris sur le SearchText l'erreur ne semble pas plus mais le dernier ne peut pas chercher rien .i changé aussi StartWith avec Contient mais rien.Comment – JayJay

Questions connexes