【问题标题】:How reuse correctly controls at flowlayoutpanel?如何在 flowlayoutpanel 上正确重用控件?
【发布时间】:2017-08-05 05:02:03
【问题描述】:

我有 2 个文本框:

  1. 待售产品数量,可以是1-35
  2. 要加油的产品数量,可以是1-35

35 个隐藏的图片框,其中包含来自 .imagelocation 的产品图片 - 命名为 picturebox1、picturebox2、picturebox3 等 2 个按钮:销售和加油

销售按钮:一个循环显示可供销售的产品图像的数量(从销售数字文本框中计算),然后我将它们排序并将其添加到流程布局面板中:

For i As Integer = 1 To numberofproductstosale.Text
            If Me.Controls.ContainsKey("PictureBox" & i) Then
                Me.Controls("PictureBox" & i).Visible = True
                Me.Controls("PictureBox" & i).Margin = New Padding(0)
                Dim p1 As PictureBox = CType(Me.Controls("PictureBox" & i), PictureBox)
                FlowLayoutPanel1.Controls.Add(p1)
            End If
        Next

它有效!并正确显示每个项目... 但是,然后我想重复使用相同的flowlayoutpanel来显示加油项目,但我没有做到!

曾经,我曾尝试在 REFUEL BUTTON 处使用:

FlowLayoutPanel1.Controls.clear()

然后第一次添加类似的代码以添加+取消隐藏......但它不起作用,我也尝试了一个新循环来单独删除 35 个元素(picbxs)......并使用类似的第一个代码再次添加,但是不起作用,单独单独的删除+隐藏看起来像这样:

For i2 As Integer = 1 To 35
    If Me.Controls.ContainsKey("PictureBox" & i2) Then
       Me.Controls("PictureBox" & i2).Visible = False
       Dim p2 As PictureBox = CType(Me.Controls("PictureBox" & i2), PictureBox)
       FlowLayoutPanel1.Controls.Remove(p2)
    End If
 Next

我认为删除和隐藏是正确的,因为每个项目都会从屏幕上消失.. 然后我尝试再次添加和取消隐藏图片框,但现在由加油列表(文本框)的数量决定使用此代码:

 For i3 As Integer = 1 To productstorefuel.Text
            If Me.Controls.ContainsKey("PictureBox" & i3) Then
                Me.Controls("PictureBox" & i3).Visible = True
                Me.Controls("PictureBox" & i3).Margin = New Padding(0)
                Dim p3 As PictureBox = CType(Me.Controls("PictureBox" & i3), PictureBox)
                FlowLayoutPanel1.Controls.Add(p3)
End If
next

我的代码看起来不错、整洁且符合逻辑!为什么不工作?我在不同的循环中使用 i、i2、i3 以避免混淆......更好:我还尝试取消隐藏添加到第二个流布局面板中,隐藏第一个面板并将第二个面板,但不起作用!..我只能回到屏幕上的第一个面板和排序项目..这部分代码看起来像这样

FlowLayoutPanel1.visible = false    
FlowLayoutPanel2.visible = true
 For i3 As Integer = 1 To productstorefuel.Text
            If Me.Controls.ContainsKey("PictureBox" & i3) Then
                Me.Controls("PictureBox" & i3).Visible = True
                Me.Controls("PictureBox" & i3).Margin = New Padding(0)
                Dim p3 As PictureBox = CType(Me.Controls("PictureBox" & i3), PictureBox)
                FlowLayoutPanel2.Controls.Add(p3)
End If
next
    FlowLayoutPanel2.BringToFront()

注意:我知道代码的第一部分(销售部分)很好,因为 我的按钮确实是带有按钮方面的复选框,然后,我可以看到处理速度,因为当我取消选中销售按钮图片框只是隐藏/显示非常快,但是当我在按钮(销售加油)之间单击时,我几乎可以检测到图片框图像的缓慢重新加载。但是在加油时点击(选中或取消选中)没有任何反应!屏幕仍然是空的......我认为问题是我如何删除它。有什么建议么?? 提前致谢!

【问题讨论】:

  • 一个更好的方法是拥有一个由 35 个图片框组成的数组,然后每次将所需的数量添加到面板中。事实上,您的代码正在泄漏。
  • 我已经解决了这个问题:控件必须返回到 form1 容器中,而不是清除或删除它们.. 以与添加到 flowpanel 相同的方式添加回 form1.. .那么它们可以很好地重复使用..

标签: vb.net controls reusability flowlayout


【解决方案1】:

我这样解决了这个问题:控件(在flowlayoutpanel 内)必须回到form1 容器中,而不是清除或删除它们,方法是将它们添加回form1,方法与添加到@ 的方式相同。 987654324@。然后就可以正确地重复使用了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多