我正在使用C#。我的问题是关于一个讨厌的ListBox,它只是不想听。
代码:
void client_UserAvailable(object sender, IMAvailEventArgs e)
{
this.BeginInvoke(new MethodInvoker(delegate
{
if (listBoxContacts.Items != null)
{
string available = "";
if (e.IsAvailable)
available = "Online";
else
available = "Offline";
if (listBoxContacts.Items.Count <= 0 || !listBoxContacts.Items.Contains(e.UserName))
listBoxContacts.Items.Add(e.UserName + " " + available);
else
{
for (int i = 0; i < listBoxContacts.Items.Count; i++)
{
string _user = (string)listBoxContacts.Items[i];
_user.Replace(_user, e.UserName + " " + available);
}
}
}
}));
}
一旦我运行该事件,如果ListBox的项目数小于或等于0或者ListBox.Items不包含用户名,它将把用户名添加到列表中。如果它包含用户名或计数更大,则它将更新for循环中的用户状态。
但是,当尝试替换该值时,它只是重复它。我还尝试在'_user.Replace(_user,e.UserName +“”+ available);'下面添加'删除(_user)',但它只是重复。
我可以通过在我的计时器中添加一个'ListBox.Items.Clear'来解决这个问题,该计时器以5秒的间隔更新ListBox:
private void timer_Tick(object sender, EventArgs e)
{
if (isOnline)
{
if (listBoxContacts.Items != null)
{
foreach (string user in friends)
{
listBoxContacts.Items.Clear();
client.IsAvailable(user);
if (infoWindow != null)
{
infoWindow.Close();
infoWindow = null;
}
}
}
}
}
但是,ListBox项目闪烁。我不希望它眨眼,所以我想找到替代品。我搜索了很多相关的问题,但都没有成功的帮助。非常感谢帮助。
答案 0 :(得分:2)
基于评论看起来第一个问题是这个条款:
!listBoxContacts.Items.Contains(e.UserName)
如果现有项始终是username +(space)+ availability,那么该子句将始终返回false,因此始终会触发添加新条目。 您应该将该子句更改为:
(!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;
}
答案 1 :(得分:1)
问题在于你使用String.Replace
该方法返回的字符串不会改变原始字符串。
从上面链接:
返回一个新字符串,其中当前字符串中所有出现的指定Unicode字符或字符串都替换为另一个指定的Unicode字符或字符串。
所以我会这样做:
listBoxContacts.Items[i] = _user.Replace(_user, 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;
}
}
答案 2 :(得分:1)
替换方法不会更改_user,因为字符串是不可变的,而是应该使用
_user = _user.Replace(_user, e.UserName + " " + available);