2008-09-25 55 views
1

我有用C#編寫的Windows窗體應用程序。它的工作是將消息發送給用戶列表。當這些消息正在發送時,我想顯示每個用戶的操作狀態。我正在做的(對於每個用戶)正在創建一個Label控件並將其添加到Panel。這對於一小部分用戶來說沒有問題。當我增加大小爲1000或更大,Visual Studio調試器顯示以下消息:將大量控件添加到.NET Windows窗體(C#)時遇到問題

類型的第一次機會異常「System.ComponentModel.Win32Exception」發生在 System.Windows.Forms.dll中甲類型 「System.Reflection.TargetInvocationException」的第一次機會異常出現在mscorlib.dll的

然後應用程序掛起。有什麼想法,我做錯了什麼,我該如何解決這個問題?

回答

3

考慮到大小,我會考慮在RichTextBox中顯示您的狀態。

發生了什麼事情是您正在生成太多的句柄,並且Framework無法處理它們。

+0

絕對...... adeel825,請記住,幾乎所有在System.Windows.Forms(也許是一切)對應於Windows API,並受到它的限制。 – 2008-09-25 21:40:42

2

這是一種解決方法,但我不認爲你的用戶真的想看1000人的名單。向他們展示當前/最近的摘要報告。或讓他們翻閱。

3

改爲使用DataGridView

0

控件太多!使一個控件包含所有這些狀態消息。多行文本框怎麼樣?

1

沒有看到特定的代碼,很難說。如果我的任務是同一個程序,我會以不同的方式處理它。

我會使用網格或列表視圖來顯示用戶和他或她的消息正在發送的狀態。這些控件可以處理無限的(受系統內存限制的)行數。每個用戶一行(或每條消息一行 - 哪個更好)。

這應該是唯一在UI線程中進行的事情。使用後臺工作器(BacngroundWorker類)或消息隊列框架(MSMQ,SQL Server)使消息異步發送,並通過BackgroundWorker報告狀態備份。

至於你的具體錯誤 - 我不知道你爲什麼得到它。對於可以放在WinForm上的標籤數量應該沒有限制。我懷疑這個錯誤是由別的東西引起的。

0

如果您確實只在面板中顯示標籤,我建議您使用GDI顯示狀態。在OnPaint中寫入可見區域的文本,並且只有在狀態標籤發生變化時才使該區域無效。

1

改爲在您的窗體上放置一個ProgressBar。如果您向1000人發送一條消息,則每次發送消息時只需將ProgressBar遞增1。

如果要向1000個人發送5條消息,請爲消息提供一個進度條,爲一個人提供一個消息(第一個條上的每個值第二個條會循環一次)。

你也可以爲每個進度條(說「95%完成」或「消息3的5」或其他)標籤。

你不能在.NET窗體上擁有如此大量的控件,即使可以,任何用戶都無法在同一時間看到它們。

1

我喜歡在詳細模式下使用ListView。通常,我會做一個添加行的例行程序,使其處於選中狀態,然後在該項上調用EnsureVisible()以自動滾動到該行。

就像已經提到的那樣,控件與一個或多個窗口句柄相關,操作系統只能發佈這麼多。

相關問題