Искать в ListBox

2

HI

Я пытаюсь поместить текстовое поле для поиска в listBox. У меня есть 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
    Добавлен полный пример; Я думаю, что это показывает все из ваших комментариев ...
Теги:
winforms
search
listbox

1 ответ

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))
  • 0
    @DOK: Да, но SelectedItem - это объект, а не строка.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню