我正在使用 C#。我的问题是关于一个不想听的讨厌的列表框。
代码:
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);' 下面添加一个 'Remove(_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 项目闪烁。我不想让它眨眼,所以我正在寻找替代品。我搜索了很多相关的问题,但没有一个是成功的。帮助将不胜感激。