我正在開發一個信使程序,並且我有一個定時器不斷刪除並添加新的列表框項目,以便列表框始終閃爍。我試圖讓閃爍停下來。我經常刪除並添加新列表框項目的原因是因爲如果朋友登錄,它會將狀態從脫機狀態更改爲在線狀態。如何用計時器更新列表框項目
定時器代碼:
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
而不是在查詢上完成重繪,您可以檢測更改並只更新受影響的項目。爲此,您需要一些關鍵字段(例如電子郵件?它是否是唯一的?)。不要'清除()',而是通過項目並更新它們。 – Sinatr