C# ListBox-我需要删除一个项目,但它会不断复制它们

C# ListBox-我需要删除一个项目,但它会不断复制它们,c#,listbox,C#,Listbox,我用的是C。我的问题是关于一个讨厌的列表框,它就是不想听 代码: 但是,列表框项目会闪烁。我不想让它眨眼,所以我正在努力寻找替代品。我搜索了很多相关的问题,但没有一个能帮上忙。非常感谢您的帮助。问题在于您使用的方法返回的字符串不会改变原始字符串 从以上链接: 返回一个新字符串,其中当前字符串中指定的Unicode字符或字符串的所有匹配项都替换为另一个指定的Unicode字符或字符串 所以我会做一些类似的事情: listBoxContacts.Items[i] = _user.Replace(_u

我用的是C。我的问题是关于一个讨厌的列表框,它就是不想听

代码:


但是,列表框项目会闪烁。我不想让它眨眼,所以我正在努力寻找替代品。我搜索了很多相关的问题,但没有一个能帮上忙。非常感谢您的帮助。

问题在于您使用的方法返回的字符串不会改变原始字符串

从以上链接:

返回一个新字符串,其中当前字符串中指定的Unicode字符或字符串的所有匹配项都替换为另一个指定的Unicode字符或字符串

所以我会做一些类似的事情:

listBoxContacts.Items[i] = _user.Replace(_user, e.UserName + " " + available);
(!listBoxContacts.Items.Contains(e.UserName + " Online" ) && !listBoxContacts.Items.Contains(e.UserName + " Offline"))
string currentItem = listBoxContacts.Items[i];
if(currentItem.Contains(e.UserName))
{
    listBoxContacts.Items[i] = e.UserName + " " + available;
}

您必须在
for
语句中检查用户名,否则您将在列表中重复用户名

大概是这样的:

for (int i = 0; i < listBoxContacts.Items.Count; i++)
{
    if (((string)listBoxContacts.Items[i]).Contains(e.UserName))
    {
        listBoxContacts.Items[i] =  e.UserName + " " + available;
        break;
    }

}
for(int i=0;i
问题在于使用该方法时返回的字符串不会改变原始字符串

从以上链接:

返回一个新字符串,其中当前字符串中指定的Unicode字符或字符串的所有匹配项都替换为另一个指定的Unicode字符或字符串

所以我会做一些类似的事情:

listBoxContacts.Items[i] = _user.Replace(_user, e.UserName + " " + available);
(!listBoxContacts.Items.Contains(e.UserName + " Online" ) && !listBoxContacts.Items.Contains(e.UserName + " Offline"))
string currentItem = listBoxContacts.Items[i];
if(currentItem.Contains(e.UserName))
{
    listBoxContacts.Items[i] = e.UserName + " " + available;
}

您必须在
for
语句中检查用户名,否则您将在列表中重复用户名

大概是这样的:

for (int i = 0; i < listBoxContacts.Items.Count; i++)
{
    if (((string)listBoxContacts.Items[i]).Contains(e.UserName))
    {
        listBoxContacts.Items[i] =  e.UserName + " " + available;
        break;
    }

}
for(int i=0;i
替换方法不会更改用户,因为字符串是不可变的,您应该使用

_user = _user.Replace(_user, e.UserName + " " + available);

replace方法不会更改用户,因为字符串是不可变的,您应该使用

_user = _user.Replace(_user, e.UserName + " " + available);

根据评论,第一个问题似乎是这一条款:

!listBoxContacts.Items.Contains(e.UserName)
如果现有项始终为username+(space)+availability,则该子句将始终返回false,因此始终触发添加新条目。 您应该将该条款更改为类似以下内容:

listBoxContacts.Items[i] = _user.Replace(_user, e.UserName + " " + available);
(!listBoxContacts.Items.Contains(e.UserName + " Online" ) && !listBoxContacts.Items.Contains(e.UserName + " Offline"))
string currentItem = listBoxContacts.Items[i];
if(currentItem.Contains(e.UserName))
{
    listBoxContacts.Items[i] = e.UserName + " " + available;
}
下一个问题是循环-看起来您最终尝试更新列表中每个人的状态,而不仅仅是与事件相关的特定用户的状态

最后,您不会替换列表框中的现有值

您可能需要执行以下操作:

listBoxContacts.Items[i] = _user.Replace(_user, e.UserName + " " + available);
(!listBoxContacts.Items.Contains(e.UserName + " Online" ) && !listBoxContacts.Items.Contains(e.UserName + " Offline"))
string currentItem = listBoxContacts.Items[i];
if(currentItem.Contains(e.UserName))
{
    listBoxContacts.Items[i] = e.UserName + " " + available;
}

根据评论,第一个问题似乎是这一条款:

!listBoxContacts.Items.Contains(e.UserName)
如果现有项始终为username+(space)+availability,则该子句将始终返回false,因此始终触发添加新条目。 您应该将该条款更改为类似以下内容:

listBoxContacts.Items[i] = _user.Replace(_user, e.UserName + " " + available);
(!listBoxContacts.Items.Contains(e.UserName + " Online" ) && !listBoxContacts.Items.Contains(e.UserName + " Offline"))
string currentItem = listBoxContacts.Items[i];
if(currentItem.Contains(e.UserName))
{
    listBoxContacts.Items[i] = e.UserName + " " + available;
}
下一个问题是循环-看起来您最终尝试更新列表中每个人的状态,而不仅仅是与事件相关的特定用户的状态

最后,您不会替换列表框中的现有值

您可能需要执行以下操作:

listBoxContacts.Items[i] = _user.Replace(_user, e.UserName + " " + available);
(!listBoxContacts.Items.Contains(e.UserName + " Online" ) && !listBoxContacts.Items.Contains(e.UserName + " Offline"))
string currentItem = listBoxContacts.Items[i];
if(currentItem.Contains(e.UserName))
{
    listBoxContacts.Items[i] = e.UserName + " " + available;
}


listbox项的底层类型到底是什么-字符串还是其他类型?以及现有用户的项目可以采用哪些值-仅用户名或
username+“”+available
?类型只是一个字符串。是的,这只是用户名空间的可用性。listbox项的基本类型是什么-字符串,还是其他类型?以及现有用户的项目可以采用哪些值-仅用户名或
username+“”+available
?类型只是一个字符串。是的,这只是用户名空间的可用性。老实说,我不敢相信我没有发现第一个问题(“Contains(e.username);”)--好的。所以,我尝试了你的方法,但不知怎么的,它只是复制了我朋友列表(ListBox)上的第一个用户。想了想,可能还发现了一些其他问题-请参阅最新编辑,让我知道goesIt是如何工作的;但是,当我的一个朋友脱机时,它会复制他的姓名和状态。更新后的if语句现在是这样的:
if(listBoxContacts.Items.Count我这样做了,但我显然删除了导致问题的一行代码。我使用了一些BETA测试人员进行了测试,结果成功了!感谢您花时间与我一起解决这个问题。老实说,我不敢相信我没有发现第一个问题(“Contains(e.UserName);”)--好的。所以,我尝试了你的方法,它只是复制了我朋友列表(ListBox)上的第一个用户。多想了一想,可能发现了一些其他问题-请参阅最新编辑,让我知道goesIt的工作原理;但是,当我的一个朋友脱机时,它会复制他的姓名和状态。更新后的if语句现在是这样的:
if(listBoxContacts.Items.Count我这样做了,但我显然删除了导致问题的一行。我使用了一些BETA测试仪进行了测试,它工作正常!感谢您花时间与我一起解决这个问题。感谢您的尝试,但它仍然会重复。感谢您的尝试,但它仍然会重复。它也会这样做这是我对这一点的评论:“它非常有效;但是,当我的一个朋友离线时,它会复制他的名字和身份。”@user1322822我所做的更改将在第一次匹配后中断循环。它在我的测试中没有重复。@user1322822请将您当前修改的代码添加到您的问题中。它与chamila_c的方法的作用相同。以下是我对此的评论:“它工作得很好;但是,当我的一个朋友脱机时,它会复制他的姓名和状态。”@user1322822我所做的更改将在第一次匹配后打破循环。它不会复制我的姓名和状态