110,962
社区成员
发帖
与我相关
我的任务
分享
foreach (FileInfo file in files)
{
ListViewItem item = new ListViewItem();
item.Tag = file;
item.SubItems.AddRange(SubItems.ToArray());
doRefreshingItem(item);
cSourceFiles.Items.Add(item);
}
foreach (FileInfo file in files)
{
ListViewItem item = new ListViewItem();
item.Tag = file;
item.SubItems.AddRange(SubItems.ToArray());
cSourceFiles.Items.Add(item);
doRefreshingItem(item);
}
foreach (FileInfo file in files)
{
ListViewItem item = new ListViewItem();
item.Tag = file;
// 用Add替代AddRange
for (int i = 1; i < listView1.Columns.Count; i++)
item.SubItems.Add(new ListViewItem.ListViewSubItem());
listView1.Items.Add(item);
doRefreshingItem(item);
}
至于原因,先来看看ListViewSubItem.Text属性的源代码。
public string Text {
get {
return text == null ? "" : text;
}
set {
text = value;
if (owner != null) {
owner.UpdateSubItems(-1);
}
}
}
看它的赋值,只有owner非空时才会到界面上更新显示的文字,那么这个owner是在什么值被赋值的呢,当然是在被Add的时候。下面来看看Add和AddRange的代码。
public ListViewSubItem Add(ListViewSubItem item) {
EnsureSubItemSpace(1, -1);
item.owner = this.owner;
owner.subItems[owner.SubItemCount] = item;
owner.UpdateSubItems(owner.SubItemCount++);
return item;
}
public void AddRange(ListViewSubItem[] items) {
if (items == null) {
throw new ArgumentNullException("items");
}
EnsureSubItemSpace(items.Length, -1);
foreach(ListViewSubItem item in items) {
if (item != null) {
owner.subItems[owner.SubItemCount++] = item;
}
}
owner.UpdateSubItems(-1);
}
看清楚了吗,在Add方法里确实有对owner的赋值,但在AddRange里没有,这个就是问题所在了。
private void doRefreshingItem(ListViewItem item)
{
FileInfo info = (FileInfo)item.Tag;
item.Text = info.Name;
item.SubItems[1].Text = info.Length.ToString("N0");
item.SubItems[2].Text = info.LastWriteTime.ToString();
}
不知道为什么,ListViewItem在添加到ListView以后,无论如何改SubItem的Text,界面上都不会更新,即使使用Refresh或Invalidate也没用,但是在更改了ListViewItem的Text以后,所有的SubItem就全部改过来了。先不管为什么会是这种情况,解决办法很简单,在doRefreshingItem里,把对item.Text的赋值移到所有SubItem之后就可以了。
private void doRefreshingItem(ListViewItem item)
{
FileInfo info = (FileInfo)item.Tag;
item.SubItems[1].Text = info.Length.ToString("N0");
item.SubItems[2].Text = info.LastWriteTime.ToString();
item.Text = info.Name;
}