【发布时间】:2016-07-06 12:43:34
【问题描述】:
我正在开发一个信使程序,我有一个计时器,它不断删除和添加新的列表框项目,因此列表框一直闪烁。我试图让闪烁停止。我不断删除和添加新列表框项目的原因是,如果朋友登录,它会将那里的状态从离线更改为在线。
定时器代码:
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();
有没有办法不断更新当前列表框项而不是不断删除和添加新项?
这是图形用户界面:
【问题讨论】:
-
为什么不对
Status属性使用事件处理程序。这样只有在发生变化时才会调用更新? -
您不只是添加和删除 - 您正在清除列表并每隔一段时间完全重新填充它。
-
您可以检测更改并仅更新受影响的项目,而不是完全重绘查询。为此,您需要一些关键字段(例如电子邮件?它是唯一的吗?)。不要
Clear(),而是检查项目并更新它们。 -
这就是问题所在,除了删除和重新填充它们之外,我真的不知道如何更新它们:/
-
a) 将 BindingList
与具体类一起使用。对列表内容的更改将显示在控件中。 B)也许实现 INotifyPropertyChanged C)然后只更新列表 D)我认为您想将这些状态指示器图像加载到数组中 - 您的应用程序可能会泄漏
标签: c# .net winforms listbox updates