搜索项目具有自定义数据的列表框
Searching a ListBox where Items have customised data
我正在将数据加载到带有附加日期时间数据的列表框中。现在我想在列表框中搜索包含 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 应该是您的标签 ID,但它是 private。请给它写一个public 属性,你的tagID就在那里
Items.Contains 方法测试参数的 身份 ,对象存储在 ListBox.Items 中。但是因为你没有对象,只有一个字符串值,所以它不能工作,所以你需要 search through the Items..:[=15=]
将text public
设为J.C后。已经注意到,您可以在这样的函数中访问它:
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;
}
这将 return 具有您搜索的 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) ..
我正在将数据加载到带有附加日期时间数据的列表框中。现在我想在列表框中搜索包含 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 应该是您的标签 ID,但它是 private。请给它写一个public 属性,你的tagID就在那里
Items.Contains 方法测试参数的 身份 ,对象存储在 ListBox.Items 中。但是因为你没有对象,只有一个字符串值,所以它不能工作,所以你需要 search through the Items..:[=15=]
将text public
设为J.C后。已经注意到,您可以在这样的函数中访问它:
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;
}
这将 return 具有您搜索的 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) ..