私はメッセンジャープログラムで作業しています。リストボックスが常にちらつくように、新しいリストボックスアイテムを絶えず削除して追加するタイマーがあります。私はちらつきを止めようとしています。私が絶えず削除して新しいリストボックスアイテムを追加するのは、友人がログインすると、ステータスがオフラインからオンラインに変わるからです。リストボックスのアイテムをタイマーで更新する方法
タイマーコード:
private void Requests_Tick(object sender, EventArgs e)
{
LoadData();
}
loaddataの()コード:
FriendsLb.BeginUpdate();
_S = new Status();
Image Status = null;
FriendsLb.Items.Clear();
try
{
var query = from o in Globals.DB.Friends
where o.UserEmail == Properties.Settings.Default.Email
select new
{
FirstName = o.FirstName,
LastName = o.LastName,
Email = o.Email,
Status = o.Status,
Display = string.Format("{0} {1} - ({2})", o.FirstName, o.LastName, o.Email)
};
newFriendsLb.DataSource = query.ToList();
newFriendsLb.ClearSelected();
FriendsLb.DrawMode = DrawMode.OwnerDrawVariable;
foreach (object contact in query.ToList())
{
string details = contact.GetType().GetProperty("Display").GetValue(contact, null).ToString();
string email = contact.GetType().GetProperty("Email").GetValue(contact, null).ToString();
string status = _S.LoadStatus(email);
if (status == "Online")
{
Status = Properties.Resources.online;
}
else if (status == "Away")
{
Status = Properties.Resources.busy;
}
else if (status == "Busy")
{
Status = Properties.Resources.away;
}
else if (status == "Offline")
{
Status = Properties.Resources.offline;
}
FriendsLb.Items.Add(new Listbox(_A.LoadFriendAvatar(email), Status, details));
}
contact = query.ToList();
FriendsLb.MeasureItem += FriendsLb_MeasureItem;
FriendsLb.DrawItem += FriendsLb_DrawItem;
FriendsLb.EndUpdate();
は、現在のリストボックス項目常にではなく、常に新しいものを削除し、追加を更新する方法はありますか?
はここにGUIです:
「Status」プロパティにイベントハンドラを使用してみませんか?そうすれば、変更があった場合にのみ更新が呼び出されます。 –
追加と削除だけではなく、リストを消去して、ある程度の間隔で完全に再作成しています。 – Plutonix
クエリで完全に再描画する代わりに、変更を検出して影響を受けるアイテムのみを更新することができます。このためには、いくつかの重要なフィールドが必要です(例えば、電子メールはユニークですか?)。 'Clear()'をしないでください。しかし、アイテムを通過してそれらを更新してください。 – Sinatr