2010-02-19 24 views
0

我正在使用C#編寫一個數據包分析應用程序,並將數據包從網絡傳輸到datagridview,但一旦它開始填充,datagrivdview滾動變爲如下圖所示,我無法評分?我如何解決這個問題?Winforms Data Grid Scrolling問題

基本上問題是數據進入速度非常快,所以它可能無法處理它?

alt text http://img705.imageshack.us/img705/2681/gridviewscrollingissue.png

我手動和這裏填充數據是代碼:

string[] row = { packetsList[countOfPacketCaptures].packetType, packetsList[countOfPacketCaptures].sourceAddress, packetsList[countOfPacketCaptures].destinationAddress, packetsList[countOfPacketCaptures].sourcePort, packetsList[countOfPacketCaptures].destinationPort, packetsList[countOfPacketCaptures].packetMessage }; 

dgwPacketInfo.Rows.Add(row); 
+0

你正在觀看主UI線程或後臺線程上的數據包嗎? – 2010-02-19 02:40:07

+0

後臺線程。 – itsaboutcode 2010-02-19 03:00:22

+0

好的。也許你應該實現某種緩衝。 (看我的回答) – 2010-02-19 03:33:01

回答

2

你是如何填充整個的DataGridView?也許你應該嘗試在virtual mode中使用它,這意味着DataGridView會詢問你在可見範圍內的數據,並且只在需要的時候詢問數據。

你在做主UI線程或後臺線程上的人口嗎?如果你在工作中捆綁主線程,那麼你的UI會變得遲鈍。

我建議你在後臺實現一個列表,並從後臺線程向它添加數據。使用與虛擬模式相關的事件(請參閱this walkthrough),並從列表中提供數據。當你更新列表時,你需要刷新DataGridView(在主線程上,因爲DataGridView需要這個)。

我不知道有多少數據包你看到第二個,但也許你應該緩衝他們,只刷新DataGridView每10個數據包一次或每隔一秒鐘(或任何數字在你的情況下有意義)保持一次用戶界面響應並不會因刷新而超載。

private delegate void ParameterlessVoid(); 

private void RefreshDataGridViewThreadSafe() 
{ 
    if (this.dataGridView.InvokeRequired) 
    { 
     this.dataGridView.Invoke(new ParameterlessVoid(this.RefreshDataGridView)); 
    } 
    else 
    { 
     this.RefreshDataGridView(); 
    } 
} 

private void RefreshDataGridView() 
{ 
    this.dataGridView.Refresh(); 
} 
+0

這是我如何添加數據。 串[]行= {packetsList [countOfPacketCaptures] .packetType,packetsList [countOfPacketCaptures] .sourceAddress,packetsList [countOfPacketCaptures] .destinationAddress,packetsList [countOfPacketCaptures] .sourcePort,packetsList [countOfPacketCaptures] .destinationPort,packetsList [countOfPacketCaptures] .packetMessage} ; dgwPacketInfo.Rows.Add(row); – itsaboutcode 2010-02-19 01:19:16

0

把你的問題帶到極致。當你每秒獲得50,000個新物品時會發生什麼?你想顯示全部是那個數據?數據顯示全部是否有意義?用戶是否想要查看所有數據?

手動填充網格(或任何類似的控件,如ListView)很可能無法滿足您的需求,除非您找到一種方法來過濾掉不必要的數據。例如,如果您僅在一個端口上查看數據包,或者只想查看特定計算機上的數據,則您的方法可能會有效。

我第二次扎克約翰遜的答案 - 考慮虛擬顯示您的數據。你的用戶會感謝你。

+0

那麼當我使數據虛擬選項爲真,它什麼也沒有顯示!其次,它要求我的客戶展示數據,如線鯊魚。 – itsaboutcode 2010-02-19 02:13:22

+1

@itsaboutcode:您必須使用與虛擬模式關聯的事件並設置行數,以便虛擬模式DataGridView顯示任何內容。 – 2010-02-19 02:27:25

+1

@itsaboutcode:將Designer屬性設置爲true不會爲您編寫代碼! **閱讀** Zach答案中提供的鏈接。 – 2010-02-19 03:27:17