我有一个多窗格的表单,在左窗格中是一棵树,在右窗格中是一个面板。树选择导致在Panel上加载特定的UserControl。在这种情况下,由于父表单总是被加载,我无法挂钩到父表单的Shown事件。
我的大多数UC都有一个未绑定的DataGridView,需要在创建UC时填充它们。从SQL Server数据库中有时可以预先添加50,000行。
到目前为止,我已经在UC构造函数中填充了网格,但是自从我们开始使用50,000行后,事情就发生了变化。我发现,由于某些疯狂的原因,从构造函数中填充50,000行的网格需要至少15分钟。但是,如果我等到填充网格直到我单击按钮或从Load事件,则需要15秒。这是一个谜。所以我试图将网格加载到别处。
但是,当我尝试从Load事件填充网格时,会出现视觉上的不一致。会发生什么,是否看到我的UC的小版本出现,加载DGV行需要15秒,然后UC扩展以填充Panel(UC Dock属性设置为Fill)。所以我也不喜欢这个选项。
如果它存在于UC,那么显示的事件将是加载我的网格的理想场所。有没有人知道另一种方法呢?
答案 0 :(得分:19)
我对类似问题的回答是在网格首次可见时填充DGV。这是延迟加载的本质;在最后一秒获得信息。
挂钩进入VisibleChanged,当你的控件调用Show()或Hide()或手动设置Visible属性时将触发。如果该字段当前可见,并且控件未处于关闭或处置的过程中(因为在某些奇怪的原因,控件在这种情况下可见),请执行网格填充。
这是必要的处理程序,非常简单:
protected override void OnVisibleChanged(EventArgs e)
{
base.OnVisibleChanged(e);
if (Visible && !Disposing) PopulateGridView(); //<-- your population logic
}