2008-09-25 80 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()以自动滚动到该行。

就像已经提到的那样,控件与一个或多个窗口句柄相关,操作系统只能发布这么多。

相关问题