原文地址:
http://hi.baidu.com/susdisk/blog/item/ee133dcbf19417f553664f46.html原文地址:
http://blog.csdn.net/hfzsjz/archive/2008/12/15/3521631.aspx
這個問題網(wǎng)上有成型的解決方法,引起閃爍的問題有兩個:
一,是加入刪除大量數(shù)據(jù)引起。
二,是沒有開啟LISTVIEW的雙緩存功能。
我需要用一個TIMER實時更新LISTVIEW,遇到的是第二個問題,重載LISTVIEW,寫一個新組件,然后在FORM.DESIGNER文件里將LISTVIEW替換為這個類即可:
class DoubleBufferListView: ListView
{
public DoubleBufferListView()
{
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
}
}
另外:加入刪除大量數(shù)據(jù)
防止閃爍的ListView顯示方案
相信做Win Form程序的朋友們一定遇到過在ListView中插入數(shù)據(jù)時,界面上一直在閃爍,而且速度很慢的情況吧。究其原因,還是在Windows消息機制沒有使用好的原因。
本文對于ListView閃爍的原因,進(jìn)行探究,并對于不同種的情況給出解決方案。
閃爍的原因
ListView閃爍的原因有以下幾點或幾種情況:
1:在數(shù)據(jù)多次插入間,存在時間間隔。
2:使用普通的Items.Add方法插入的數(shù)據(jù)量過大。
3:界面上有多個ListView在進(jìn)行數(shù)據(jù)插入。
最根本的原因是因為,每次調(diào)用ListView實例進(jìn)行插入的時候,都需要向系統(tǒng)發(fā)送一個窗口消息(相信做C++的朋友應(yīng)該很清楚),然后窗口接到消息就會刷新對應(yīng)控件的界面。所以,如果間隔時間長,或插入次數(shù)多,一定會閃爍的。
防止閃爍的ListView顯示方案 收藏
The resolution of ListView Blink
防止閃爍的ListView顯示方案
相信做Win Form程序的朋友們一定遇到過在ListView中插入數(shù)據(jù)時,界面上一直在閃爍,而且速度很慢的情況吧。究其原因,還是在Windows消息機制沒有使用好的原因。
本文對于ListView閃爍的原因,進(jìn)行探究,并對于不同種的情況給出解決方案。
閃爍的原因
ListView閃爍的原因有以下幾點或幾種情況:
1:在數(shù)據(jù)多次插入間,存在時間間隔。
2:使用普通的Items.Add方法插入的數(shù)據(jù)量過大。
3:界面上有多個ListView在進(jìn)行數(shù)據(jù)插入。
最根本的原因是因為,每次調(diào)用ListView實例進(jìn)行插入的時候,都需要向系統(tǒng)發(fā)送一個窗口消息(相信做C++的朋友應(yīng)該很清楚),然后窗口接到消息就會刷新對應(yīng)控件的界面。所以,如果間隔時間長,或插入次數(shù)多,一定會閃爍的。
解決方案
源碼中實例的解決方案:
ListViewItem lvi;

ListViewItem[] lvitems1 = new ListViewItem[10000];

for (int i = 0; i < 10000; i++)

{

lvi = new ListViewItem(new string[]
{ i.ToString(), "22" });
lvitems1[i] = lvi;
}

listViewTest.Items.AddRange(lvitems1);更通用的解決方法:

// create a temp dataTable to store data
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add("ID", typeof(String));
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("Class", typeof(String));
dt.Columns.Add("Lesson", typeof(String));

foreach(item in dataSource)

{
dr = dt.NewRow();
dr[0] = item.ID; // ID
dr[1] = item.Name; // Name
dr[2] = item.Class; // Class
dr[3] = item.Lesson; // Lesson

dt.Rows.Add(dr);

}

// loop the temp table , and insert to ListView

int i = 0;
while(iint iSize = (dt.Rows.Count-i)>1000?1000:(dt.Rows.Count-i);
ListViewItem lvi;

ListViewItem[] lvitems = new ListViewItem[iSize];

for (int j = 0; j < iSize; j++)

{

lvi = new ListViewItem(new string[]
{ dt.Rows[i+j][0].ToString(), dt.Rows[i+j][1].ToString(), dt.Rows[i+j][2].ToString(), dt.Rows[i+j][3].ToString() });
lvitems[i] = lvi;
}

listViewTest.Items.AddRange(lvitems);

i = i + iSize;
}

主要思路是,建一個臨時的Table,然后,把數(shù)據(jù)插入到這個臨時表中;在處理結(jié)束之后,使用Items.AddRange方法把數(shù)據(jù)分塊插入到ListView。
posted on 2010-09-01 18:15
漂漂 閱讀(3563)
評論(0) 編輯 收藏 引用 所屬分類:
c#開發(fā)