Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在显示UserControl中的方法后调用该方法?_C#_Winforms - Fatal编程技术网

C# 如何在显示UserControl中的方法后调用该方法?

C# 如何在显示UserControl中的方法后调用该方法?,c#,winforms,C#,Winforms,我有一个多窗格窗体,左窗格是一棵树,右窗格是一个面板。树选择会在面板上加载特定的UserControl。在这种情况下,由于父窗体始终处于加载状态,因此我无法钩住父窗体的显示事件 我的大多数UC上都有一个未绑定的DataGridView,需要在创建UC时填充该视图。从SQL Server数据库中,有时可以提前添加50000行 到目前为止,我已经在UC构造期间填充了网格,但是自从我们开始使用50000行以来,情况发生了变化。我发现,出于某些疯狂的原因,用构造函数中的50000行填充网格至少需要15分

我有一个多窗格窗体,左窗格是一棵树,右窗格是一个面板。树选择会在面板上加载特定的UserControl。在这种情况下,由于父窗体始终处于加载状态,因此我无法钩住父窗体的显示事件

我的大多数UC上都有一个未绑定的DataGridView,需要在创建UC时填充该视图。从SQL Server数据库中,有时可以提前添加50000行

到目前为止,我已经在UC构造期间填充了网格,但是自从我们开始使用50000行以来,情况发生了变化。我发现,出于某些疯狂的原因,用构造函数中的50000行填充网格至少需要15分钟。但是,如果我等待填充网格直到单击按钮或从Load事件开始,则需要15秒。这是个谜。因此,我试图将网格的加载移到其他地方

但是,当我尝试从Load事件填充网格时,会出现视觉上的不一致。发生的情况是,您看到my UC的一个小版本出现,加载DGV行需要15秒,然后UC展开以填充面板(UC Dock属性设置为fill)。所以我也不喜欢这个选择


显示的事件将是一个完美的地方加载我的网格,如果它存在于UC的。有人知道另一种方法吗?

我对一个类似问题的答案是在网格第一次可见时填充DGV。这就是懒惰加载的本质;尽可能在最后一秒获取信息

钩住VisibleChanged,当您的控件调用Show()或Hide()或手动设置VisibleChanged属性时,将触发该操作。如果该字段当前可见,并且控件未处于关闭或处置过程中(因为在这种情况下,由于某些奇怪的原因控件可能变为可见),请执行网格填充

下面是必要的处理程序,非常简单:

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);

    if (Visible && !Disposing) PopulateGridView(); //<-- your population logic
}
VisibleChanged上的受保护覆盖无效(EventArgs e)
{
根据可视性变化(e);

如果(可见&正在处理)PopulateGridView();//一个更好的问题是,为什么在构造函数中加载需要15分钟,而在其他地方则需要15秒。可能是因为他的填充逻辑是基于表单构造过程中多次更改的内容执行的,或者他在表单加载时正在对缓存进行重击加载多个DGV。关于为什么会发生这种情况,欢迎大家提出意见。我宁愿留在这里这是我以前的方法。代码由一个数据库调用组成(数据不变)和填充单个DGV。从构造函数调用和从按钮调用之间有区别-构造函数是从BackgroundWorker线程内部调用的。这可能是原因吗?我完全同意Justin的说法。接受的答案可能对你有用,但可能会带来其他问题。你找到原因了吗那么长的时间和/或为什么会出现视觉不一致?谢谢,我相信这对静态大小的UC有效,但是当我尝试使用我的UC时,它停靠“满”在UC调整大小以适应容器之前,网格填充到其容器中,导致在加载网格所需的15秒内,一些滚动条漂浮在半空中。不过,我确实找到了一种加载网格的方法,在加载UC后调用一个方法(需要使用ugh DoEvents使其首先绘制!)。这接近我想要的,但是现在这个加载时间发生在BackgroundWorker之外,GUI的响应性变差了(我讨厌潜在的(没有响应)。这可能是我最好的解决方案。嗯。我的带有GridView的UCs也被填充停靠。请尝试使用SuspendLayout和ResumeLayout暂停窗口元素定位,直到填充完成。要解决无响应问题,可以使用委托和事件处理程序设置用户控件,该委托和事件处理程序将与异步弹出窗口接口计算器例程。让UC启动一个BeginPopulate方法,订阅一个PopulateComplete事件,并从该处理程序中完成其网格填充工作。我发现DGV Rows.Add方法是导致问题的原因,但只有在从构造函数调用时才发生。不要调用DGV.Rows.Add(item1,item2,item3);50000次,使用DGV.Rows.Add(50000);然后沿着表格往下走,一次填写一行单元格。这可以从构造函数中调用,网格加载速度应该很快。哦,是的,如果希望应用程序响应,请不要在表单构造函数中执行长循环。我会将数据获取和填充移动到一个可处理的事件中。