Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
Vb.net winforms:加载表单时性能低下_Vb.net_Forms_Winforms_Flowlayoutpanel_Form Load - Fatal编程技术网

Vb.net winforms:加载表单时性能低下

Vb.net winforms:加载表单时性能低下,vb.net,forms,winforms,flowlayoutpanel,form-load,Vb.net,Forms,Winforms,Flowlayoutpanel,Form Load,我有一个VB.NET winforms应用程序。它的一个表单包含一个flowlayoutpanel,我在表单加载事件中用成对的label textbox动态(以编程方式)填充它。My flowlayoutpanel是在设计时创建的,除以下属性外,所有属性都设置为默认值: 自动调整大小:true 自动滚动:对 码头:填充 流向:自上而下 然后,我在form load事件中使用以下代码填充它: Private Sub MyForm_Load(ByVal sender As Object, ByV

我有一个VB.NET winforms应用程序。它的一个表单包含一个flowlayoutpanel,我在表单加载事件中用成对的label textbox动态(以编程方式)填充它。My flowlayoutpanel是在设计时创建的,除以下属性外,所有属性都设置为默认值:

  • 自动调整大小:true
  • 自动滚动:对
  • 码头:填充
  • 流向:自上而下
然后,我在form load事件中使用以下代码填充它:

Private Sub MyForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles Me.Load
    Dim lbl As Label
    Dim txt As TextBox
    Dim flowLayout As FlowLayoutPanel
    Dim g As Graphics


For i As Integer = 0 To 253
    lbl = New Label
    lbl.Text = i.ToString("000") + ":"
    lbl.Anchor = AnchorStyles.None
    lbl.AutoSize = True

    txt = New TextBox
    txt.Text = "<" + i.ToString.PadLeft(3, " ") + ">"
    txt.MaxLength = 5
    txt.Anchor = AnchorStyles.None
    txt.ReadOnly = True
    g = txt.CreateGraphics
    txt.Width = g.MeasureString(txt.Text, txt.Font).Width + 5
    g.Dispose()

    flowLayout = New FlowLayoutPanel
    flowLayout.FlowDirection = FlowDirection.LeftToRight
    flowLayout.AutoSize = True
    flowLayout.Anchor = AnchorStyles.None
    flowLayout.Margin = New Padding(0)
    flowLayout.Padding = New Padding(0)

    flowLayout.Controls.Add(lbl)
    flowLayout.Controls.Add(txt)

    Me.FlowLayoutPnl.Controls.Add(flowLayout)
Next
End Sub
Private Sub MyForm_Load(ByVal sender作为对象,ByVal e作为System.EventArgs)
处理我的事,装货
作为标签的Dim lbl
将文本框设置为文本框
将flowLayout调整为FlowLayoutPanel
Dim g作为图形
对于i,作为整数=0到253
lbl=新标签
lbl.Text=i.ToString(“000”)+“:”
lbl.Anchor=锚点类型。无
lbl.AutoSize=True
txt=新文本框
txt.Text=“”
txt.MaxLength=5
txt.Anchor=AnchorStyles.None
txt.ReadOnly=True
g=txt.CreateGraphics
txt.Width=g.MeasureString(txt.Text,txt.Font)。宽度+5
g、 处置
flowLayout=新建FlowLayoutPanel
flowLayout.FlowDirection=FlowDirection.LeftToRight
flowLayout.AutoSize=True
flowLayout.Anchor=锚点样式。无
flowLayout.Margin=新填充(0)
flowLayout.Padding=新的填充(0)
flowLayout.Controls.Add(lbl)
flowLayout.Controls.Add(txt)
Me.FlowLayoutPnl.Controls.Add(flowLayout)
下一个
端接头
如上所述,FlowLayoutPnl是在设计时创建的,其上的组件是按照自上而下的流动方向添加的

上面的代码生成了这个

这里的问题是,在打开此表单时,需要花费大量时间(几秒钟)才能打开,因为它正在执行表单加载事件中的所有操作。打开它需要35秒!。当所有的东西都完成后,形态在35秒后变得可见


所以我想知道是否有某种方法可以加速表单加载。我在这里读过一些帖子,其中提到了在加载时实现和显示某种启动屏幕,指示用户正在加载,甚至执行异步加载。从form load事件创建一个后台线程来完成这项工作怎么样?谁能给我指引正确的方向?请举一个很小的例子。这类问题通常是如何解决的?

SuspendLayout/ResumeLayout可能会有所帮助?创建和处理图形对象可能会花费很多时间。尝试删除该部分,并为所有
txt
元素指定一个固定宽度作为测试。让我们知道在那之后它的运行速度有多快。一个有762个控件的窗体将永远是一只狗。绘画将是非常糟糕的。然而,试图在这段代码中找到大约1000亿条cpu指令将是非常困难的。不要创建狗。@Arvo将SuspendLayout放在表单加载事件的开头,将ResumeLayout放在末尾是不起作用的。当然,您可以选择。绘制事件处理程序可以在几毫秒内完成。使用ListView或DataGridView可以轻松处理网格布局。你只是选择了最糟糕的选择。