【问题标题】:Trouble when adding a lot of Controls to a .NET Windows Form (C#)向 .NET Windows 窗体 (C#) 添加大量控件时出现问题
【发布时间】:2008-09-25 21:23:08
【问题描述】:

我有一个用 C# 编写的 Windows 窗体应用程序。它的工作是将消息发送到用户列表。在发送这些消息时,我想显示每个用户的操作状态。我正在做的(对于每个用户)是创建一个标签控件并将其添加到面板中。这对一小部分用户来说没有问题。当我将大小增加到 1000 或更多时,Visual Studio 调试器会显示以下消息:

“System.ComponentModel.Win32Exception”类型的第一次机会异常发生在 System.Windows.Forms.dll 类型的第一次机会异常 'System.Reflection.TargetInvocationException' 发生在 mscorlib.dll

然后应用程序挂起。关于我做错了什么以及如何解决这个问题的任何想法?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    鉴于大小,我会考虑在 RichTextBox 中显示您的状态。

    发生的情况是您生成了太多句柄,而框架无法处理所有这些句柄。

    【讨论】:

    • 绝对...... adeel825,请记住,System.Windows.Forms 中的所有内容(可能是所有内容)都对应于 Windows API,并且您受到它的限制。
    【解决方案2】:

    改用 DataGridView

    【讨论】:

      【解决方案3】:

      这是一种变通方法,但我认为您的用户并不真正想查看 1000 人的列表。向他们展示其余的当前/最新和摘要报告。或者让他们翻阅它。

      【讨论】:

        【解决方案4】:

        没有看到具体的代码,很难说。如果我的任务是相同的程序,我会以不同的方式处理它。

        我会使用 Grid 或 Listview 来显示用户和他或她正在发送的消息的状态。这些控件可以处理无限(嗯 - 受系统内存限制)行数。每个用户一行(或每条消息一行 - 效果更好)。

        这应该是 UI 线程中唯一发生的事情。使用后台工作者(BacngroundWorker 类)或消息队列框架(MSMQ、SQL 服务器)来异步发送消息并通过 BackgroundWorker 报告状态备份。

        至于你的具体错误——我不知道你为什么会得到它。您可以在 WinForm 上放置的标签数量应该没有限制。我怀疑错误是由其他原因引起的。

        【讨论】:

          【解决方案5】:

          改为在您的表单上放置一个 ProgressBar。如果您要向 1000 人发送一条消息,只需在每次发送消息时将 ProgressBar 递增 1。

          如果您要向 1000 人发送 5 条消息,请为消息设置一个进度条,为人员设置一个进度条(第二个进度条将针对第一个进度条上的每个值循环其值一次)。

          您还可以为每个进度条设置一个标签(例如“95% 完成”或“第 3 条消息,共 5 条消息”等)。

          您不能在 .NET 表单上拥有如此多的控件,即使可以,任何用户也无法同时查看所有控件。

          【讨论】:

            【解决方案6】:

            我喜欢在详情模式下使用ListView。通常,我会创建一个添加行的例程,将其选中,然后在项目上调用EnsureVisible() 以自动滚动到它。

            如前所述,控件与一个或多个窗口句柄相关,而操作系统只能分配这么多。

            【讨论】:

              【解决方案7】:

              控件太多!制作一个控件来包含所有这些状态消息。多行文本框怎么样?

              【讨论】:

                【解决方案8】:

                如果您实际上只在面板中显示标签,我建议您使用 GDI 显示状态。在 OnPaint 中写入可见区域的文本,仅当状态标签的区域发生变化时才使该区域无效。

                【讨论】:

                  猜你喜欢
                  • 2013-12-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-25
                  • 2020-11-07
                  • 2018-03-01
                  • 2021-08-18
                  相关资源
                  最近更新 更多