簡體   English   中英

搜索項目具有自定義數據的列表框

[英]Searching a ListBox where Items have customised data

我正在將數據與附加的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))..

我猜你的代碼中的tagID等於this.text

您需要知道ListBox不包含字符串列表,而是對象列表。 您可以看到tagID,因為您已經重寫了ToString()方法來顯示文本。

並根據var exp = (ExpiringItem)listBox1.Items[i]; ,exp.text應該是您的tagID,但它是private 請為其編寫一個公共屬性,並且您的tagID在那里。

Items.Contains方法對參數與存儲在ListBox.Items中的對象的身份進行測試。 但是由於您沒有對象,只有一個字符串值,所以它不起作用,因此您需要搜索 Items ..:

正如JC所指出的那樣,在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) ..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM