【问题标题】:Search in A ListBox在列表框中搜索
【发布时间】:2010-10-16 06:24:40
【问题描述】:

你好

我正在尝试将一个文本框放入列表框中进行搜索。 我有一个文本框:SearchText,代码如下:

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

和一个 ListBox On Load 我有这个代码

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 中写下以查找歌曲时,我在 ListBox 的 selectedIndexChanged 行中收到错误(“对象引用未设置为对象的实例。”)。 作为我的情况,您知道在 listBox 中查找的另一种方法吗? 谢谢你的分享。 很好的问候

【问题讨论】:

  • 添加了完整示例;我认为它显示了您的 cmets 中的所有内容...

标签: c# .net winforms search listbox


【解决方案1】:

听起来好像没有找到该项目,所以SelectedItem 为空;尝试使用:

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

我相信这可以处理 null 的情况(或者,首先测试 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));
            }
        }
    }
}

【讨论】:

  • 您可以使用 if (!String.IsNullOrEmpty(someString)) 来检查空字符串或空字符串
  • @DOK:是的,但是 SelectedItem 是对象,而不是字符串。
  • 嗨,马克,首先感谢您的支持,当我在 SearchText 上写下错误时,我按照您的建议进行了更改,但最后一个无法搜索任何内容。我也更改了 StartWith包含但什么都没有。我怎么能解决这个问题?谢谢
  • 啊我忘了,如果可以在多选记录中搜索更多结果:
  • 嗨,Marc,这是对的,但是当我搜索歌曲并单击收听时出现问题,这是正确的,但是在 Media PLayer 播放始终相同的歌曲之后...如果您遇到问题,我正在尝试有一个建议,我很高兴得到您的支持。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2017-10-04
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多