搜索项目具有自定义数据的ListBox

时间:2015-07-30 09:46:54

标签: c# search listbox

我正在使用附加的DateTime数据将数据加载到列表框中。现在我想在列表框中搜索包含tagID的项目(例如:e2003450976543)。当我搜索列表框时,即使我能看到它,也找不到tagID。我假设搜索参数不排除附加的DateTime数据。这是我的代码:

class ExpiringItem
{
    private string text;
    public ExpiringItem(string text)
    {
        this.text = text;
        this.Added = DateTime.Now;
    }
    public DateTime Added { get; private set; }
    public override string ToString()
    {
        return text;
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    for (int i = listBox1.Items.Count -1; i > -1; i--)
    {
        var exp = (ExpiringItem)listBox1.Items[i];
        var timeVisible = DateTime.Now - exp.Added;
        if (timeVisible.TotalSeconds > 30)
            listBox1.Items.RemoveAt(i);

    }
}

要插入我正在使用:lstTagsHold.Items.Add(new ExpiringItem(txtTagID.Text));

基本上我想做的就是检查列表框中是否存在tagID ......

对于我正在使用的测试:if (lstHold.Items.Contains(TagID))..

2 个答案:

答案 0 :(得分:0)

我猜你的代码中的tagID等于this.text

您需要知道ListBox不包含字符串列表,而是包含对象列表。您可以看到tagID,因为您已覆盖ToString()方法以显示文本。

根据var exp = (ExpiringItem)listBox1.Items[i];,exp.text应该是您的tagID,但它是私有。请为它写一个公共财产,你的tagID就在那里。

答案 1 :(得分:0)

Items.Contains使用存储在ListBox.Items中的对象对param的 identity 进行方法测试。但是,由于您没有对象但只有字符串值它无法正常工作,因此您需要搜索来完成项目..:

在J.C.指出text public之后,您可以使用以下函数访问它:

int findFirstID(ListBox lb, string id)
{
    for (int i = 0; i < lb.Items.Count; i++)
    {
        var ei = lb.Items[i] as ExpiringItem;
        // if text is public:
        if (ei.text == id) return i;
        // if it isn't:
        if (ei.ToString()== id) return i;

    }
    return -1;
}

这将返回包含您搜索的ID的第一个项目的索引,如果找不到,则返回-1。

如果你想要的只是检查listBox中是否有LINQ,你可以使用// if text is public: if (listBox1.Items.Cast<ExpiringItem>().Where(x => x.text == yourID).Count() > 0) .. // if it isn't:: if (listBox1.Items.Cast<ExpiringItem>().Where(x => x.ToString()== yourID).Count() > 0) ..

{{1}}