C# DataGridView是否会在添加了足够多的项而扩展到窗口之外时崩溃?

C# DataGridView是否会在添加了足够多的项而扩展到窗口之外时崩溃?,c#,datagridview,C#,Datagridview,我有一个DataGridView,只要从Udp服务器返回值,我就用这些值填充它。当只有几个值时,我的程序工作,但如果检索到足够的值,对话框需要在对话框外展开,DataGridView将冻结 我创建了这个填充DataGrid的简单方法 public void populateGrid(string[] data) { dataGrid.Rows.Add(data); } Winforms DataGridView确实应该能够轻松扩展到可见的

我有一个DataGridView,只要从Udp服务器返回值,我就用这些值填充它。当只有几个值时,我的程序工作,但如果检索到足够的值,对话框需要在对话框外展开,DataGridView将冻结

我创建了这个填充DataGrid的简单方法

public void populateGrid(string[] data)
        {
            dataGrid.Rows.Add(data);
        }

Winforms DataGridView确实应该能够轻松扩展到可见的范围之外。我经常编写的一个程序的一些DGV中有数千项,DGV在该软件中随处可见。我使用Rows.Add方法填充列表,这与您正在做的事情没有什么不同

问题是,你是如何使用这个populateGrid方法的?您是在调用中循环,还是使用带有用户输入数据的控件来形成每行的数组?如何将GridView设置为只读?用户可以添加/删除行吗?是否有事件响应DGV元素的大小调整?您是否懒惰地从某些数据源加载记录以填充此DGV


尝试连接调试器并点击暂停按钮以查看系统挂起的位置。您可能会在调用堆栈中看到重复,这表明事件处理程序的循环是无限的,或者它可能挂在一个方法调用上,您希望该方法调用很快,但正在等待一个麻烦的数据源,或者获取的信息比您需要的要多。

我不太清楚如何或为什么,但是通过创建backgroundworker并在DGV上调用委托,我在没有系统冻结的情况下完成了添加项,backgroundworker达到了它的Completed事件。

谢谢KeithS-我将尝试附加调试器。当我打开包含DGV的表单并打开到Udp服务器的连接时,来自服务器的第一条消息是预期的项目数,然后是实际的项目数,然后我关闭连接。我是否必须为传入数据“关闭”DGV?好吧,请理解UDP是一个无状态连接,很少或没有错误检查;你和服务器基本上是在互相喊叫,希望对方听到并理解信息。如果你期望5件,收到4件,其中一件在运输过程中丢失或损坏,你可以很容易地永远等待最后一件,因为服务器不知道你没有得到它,而且你可能不知道哪件你没有再次要求它。像TCP这样的协议具有更健壮的消息完整性特征;协议的实现将要求更换丢失或损坏的数据包。我找不到任何会导致系统冻结的东西。我没有让逻辑等待最后一条消息,我只使用预期的包号告诉用户预期的内容。通过创建backgroundworker并调用DGV上的委托,我在没有系统冻结的情况下完成了添加项目,backgroundworker到达了它的Completed事件。噢,我没有发现系统没有无限期冻结。是的,如果可能,所有数据检索/填充都应在后台线程中进行;否则,应用程序的主线程正忙于向DGV添加行,并且无法响应Windows消息循环。对于我的实现,我设置了一个简单的异步模型来获取数据,然后将其放在异步回调中的DGV中;异步填充不是一种很好的方法,因为它会影响GUI对象,因此必须在GUI主线程上完成。