C# 检查列表视图是否包含项目
我有一个包含3列的listview id、name、author,我使用此方法添加行:C# 检查列表视图是否包含项目,c#,listview,C#,Listview,我有一个包含3列的listview 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();
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);
}
现在我不想在插入新的book之前检查book是否存在,以避免重复元素,我尝试了这段代码,但它不起作用
我使用过这条线路,但它不起作用:
(listView1.Items.ContainsKey(book.id))
{
listView1.Items.Add(lvi1);
}
你能帮我吗?谢谢看起来您正在属性上存储您的个人名称,因此您需要查询该名称以查看是否存在给定的图书名称。您可以使用一点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);
}
由于您的编辑指示您实际上希望检查存储在ListItem级别的ID,因此您只需稍微调整条件即可检查Text属性,因为:
看起来您正在属性上存储您的个人名称,因此您需要查询该名称以查看是否存在给定的图书名称。您可以使用一点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);
}
由于您的编辑指示您实际上希望检查存储在ListItem级别的ID,因此您只需稍微调整条件即可检查Text属性,因为:
我想你错过了一场比赛!不在你的代码中
(!listView1.Items.ContainsKey(book.id))
{
listView1.Items.Add(lvi1);
}
您的代码表示,如果listview包含该键,您将添加另一个具有该键的条目。但你似乎想做相反的事,对吗?如果您的listview不包含具有该键的条目,则需要添加具有该键的条目。我认为您错过了一个!不在你的代码中
(!listView1.Items.ContainsKey(book.id))
{
listView1.Items.Add(lvi1);
}
您的代码表示,如果listview包含该键,您将添加另一个具有该键的条目。但你似乎想做相反的事,对吗?如果listview不包含具有该键的条目,则需要添加具有该键的条目。来自:
关键比较不区分大小写。Name属性对应于ListView.ListViewItemCollection中ListViewItem的键
因此,必须设置名称才能使用ContainsKey
然后其他人也像你一样:
if (!listView1.Items.ContainsKey(book.id.ToString()))
{
listView1.Items.Add(lvi1);
}
发件人:
关键比较不区分大小写。Name属性对应于ListView.ListViewItemCollection中ListViewItem的键
因此,必须设置名称才能使用ContainsKey
然后其他人也像你一样:
if (!listView1.Items.ContainsKey(book.id.ToString()))
{
listView1.Items.Add(lvi1);
}
如果有任何方法有效,请尝试以下方法:
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;
}
如果有任何方法有效,请尝试以下方法:
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;
}
看起来子项包含图书名称。这是哪个客户端库/技术?您在上面的代码中是指图书而不是点菜吗?看起来子项包含图书名称。这是哪个客户端库/技术?您在上面的代码中是指图书而不是点菜吗?抱歉,我不想与图书进行比较。id不是图书名称,如果您愿意的话若要比较ID,则可以使用!listView1.Items.Anyi=>i.Text==book.id作为您的条件。我已经用一个例子更新了我的答案。我在任何CS1061中都有一个错误:'listview1'不包含'Any'的定义,并且找不到接受'listview1'类型的第一个参数的扩展方法'Any'。您是否缺少using指令或程序集引用?。您需要引用LINQ,即使用System.LINQ。抱歉,我不想进行比较使用book.id而不是book name如果要比较id,则可以使用!listView1.Items.Anyi=>i.Text==book.id作为您的条件。我已经用一个例子更新了我的答案。任何CS1061都有一个错误:'listview1'不包含'Any'的定义,并且找不到接受'listview1'类型的第一个参数的扩展方法'Any'。是否缺少using指令或程序集引用?。您需要引用LINQ,即使用System.LINQ。