我有一个包含3列(id,name,author)的列表视图,我使用此方法添加行:
public void addToLv(Book book)
{
//TODO: Verifier si l'item existe avant d'ajouter
ListViewItem lvi1 = new ListViewItem(book.id.ToString());
lvi1.Text = book.id.ToString();
lvi1.SubItems.Add(book.name);
lvi1.SubItems.Add(carte.author);
listView1.Items.Add(lvi1);
}
现在我不想检查书是否存在,然后我插入新书以避免重复元素,我尝试这个代码,但它不工作 我已经使用了这一行,但它不起作用:
(listView1.Items.ContainsKey(book.id))
{
listView1.Items.Add(lvi1);
}
你能帮帮我吗?谢谢
答案 0 :(得分:1)
看起来您将个人姓名存储在SubItems
属性中,因此您需要查询该名称以查看是否存在给定的书名。您可以使用一些LINQ执行此操作,如下所示:
// If your ListView doesn't contain any items that have a given book as a SubItem
// then add one
if (!listView1.Items.Any(i => i.SubItems.ContainsKey(book.Name))
{
listView1.Items.Add(lvi1);
}
由于您的编辑表明您实际上想要检查ID,而不是存储在ListItem级别,因此您只需要稍微调整条件以检查Text
属性,因为{{3 }}:
if (!listView1.Items.Any(i => i.Text == book.id))
{
listView1.Items.Add(lvi1);
}
答案 1 :(得分:1)
我想你错过了一个“!” (不是)在你的代码中。
(!listView1.Items.ContainsKey(book.id))
{
listView1.Items.Add(lvi1);
}
您的代码说如果您的列表视图包含该密钥,您将添加另一个具有该密钥的条目。但似乎你想做相反的事,对吧?如果列表视图不包含具有该键的条目,则需要添加具有该键的条目。
答案 2 :(得分:1)
来自MSDN:
密钥比较不区分大小写。 Name属性对应于ListView.ListViewItemCollection中ListViewItem的键。
因此,您必须设置Name
才能使用ContainsKey
lvi1.Name = book.id.ToString();
然后其余的就像你一样:
if (!listView1.Items.ContainsKey(book.id.ToString()))
{
listView1.Items.Add(lvi1);
}
答案 3 :(得分:0)
如果一切正常,试试这个:
public void addToLv(Book book)
{
//TODO: Verifier si l'item existe avant d'ajouter
ListViewItem lvi1 = new ListViewItem(book.id.ToString());
//lvi1.Text = book.id.ToString();
lvi1.SubItems.Add(book.name);
lvi1.SubItems.Add(carte.author);
if (!existChecker(book.id.ToString()))
listView1.Items.Add(lvi1);
}
private bool existChecker(string id)
{
bool exist = false;
for (int i = 0; i < lvi1.Items.Count && exist != true; i++)
{
if (lvi1.Items[i].SubItems[0].Text == id)
exist = true;
}
return exist;
}