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

时间:2013-01-13 01:36:39

标签: c# listbox

我正在使用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项目闪烁。我不希望它眨眼,所以我想找到替代品。我搜索了很多相关的问题,但都没有成功的帮助。非常感谢帮助。

3 个答案:

答案 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);