私は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);」の下に「Remove(_user)」を追加しようとしましたが、重複するだけです。
5 秒間隔で ListBox を更新するタイマー内に「ListBox.Items.Clear」を追加することで、この問題を解決できます。
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 の項目は点滅します。点滅させたくないので、代替手段を見つけようとしています。関連する多くの質問を検索しましたが、どれも役に立ちませんでした。助けていただければ幸いです。