Vb.net FlowLayoutPanel清除后不显示多个控件
我的程序使用selenium、HTTP请求和一个称为HtmlAgilityPack的HTML解析器自动化网站上的进程 此过程中有一些部分需要用户输入,而这些输入不能由硬编码值自动填写。允许用户控制网站填写这些输入将是一个错误。这将很难知道他们什么时候完成了输入,他们可能会触摸一些他们不应该触摸的东西,这将在网站控制权移交给程序时导致错误 相反,我使用selenium下载网站的页面源代码,并使用HtmlAgilityPack解析HTML中的输入。然后动态生成与这些输入匹配的控件,并将其添加到FlowLayoutPanel。FlowLayoutPanel首次正常工作。它显示所有添加的控件。当用户完成后,他们点击一个按钮,过程继续 有时,流程会遇到错误,导致它返回到用户需要再次输入的位置。之前工作过的代码将再次在同一子例程中运行。这一切运行正常,没有错误,正如预期的那样。我已经在运行时手动检查了这些控件是否添加到FlowLayoutPanel,它们的大小是否大于0,0,并且它们是可见颜色。然而,无论有多少控件应该可见,FlowLayoutPanel中只显示过一个控件 FlowLayoutPanel的AutoScroll属性设置为true,并且有足够的空间添加更多控件。正如我所说,这在第一次很好,但在第二次就不行了。我在这个问题上已经有一段时间了,希望能得到一些帮助。下面将发布代码供您查看 我要发布的代码有几个FlowLayoutPanel。在设计器中创建的表单上的一个控件是永久性的,其他控件是动态生成的,以对控件进行分组 问题在于永久性问题。正如我所说,它显示了一个控件。此控件是第一个动态生成的流布局面板及其所有子控件。它不显示添加到其中的任何其他FlowLayoutPanel控件。先加一个就行了 对于那些想知道下面代码中FLPOutOfStock.ImprovedClear行的人来说,.Improved clear是我编写的一个扩展方法。使用普通方法清除FlowLayoutPanel时,.Clear会删除控件,但不会处理它们。我的方法处理面板中的所有控件,然后调用面板上的Clear方法 我意识到清除方法在它们被处理后是不必要的,它只是一个备份,因为任何东西似乎都不起作用。我想确保面板完全复位 代码如下:Vb.net FlowLayoutPanel清除后不显示多个控件,vb.net,winforms,controls,flowlayoutpanel,Vb.net,Winforms,Controls,Flowlayoutpanel,我的程序使用selenium、HTTP请求和一个称为HtmlAgilityPack的HTML解析器自动化网站上的进程 此过程中有一些部分需要用户输入,而这些输入不能由硬编码值自动填写。允许用户控制网站填写这些输入将是一个错误。这将很难知道他们什么时候完成了输入,他们可能会触摸一些他们不应该触摸的东西,这将在网站控制权移交给程序时导致错误 相反,我使用selenium下载网站的页面源代码,并使用HtmlAgilityPack解析HTML中的输入。然后动态生成与这些输入匹配的控件,并将其添加到Flo
Private Sub UIOutOfStockState_Load()
Try
cmdOutOfStockDeleteAll.Enabled = False
cmdOutOfStockContinue.Enabled = False
FLPOutOfStock.ImprovedClear() 'The flowlayoutpanel that does not display all controls
With New WebDriverWait(ChromeDriver, TimeSpan.FromSeconds(20)).Until(Function(driver) CBool((CType(driver, IJavaScriptExecutor)).ExecuteScript("return jQuery.active == 0")))
End With
LBLOutOfStockErrors.Text = "Notice. The following items are out of stock. Please see below for product-specific availability dates. If you have any questions, please contact Customer Service at (800) 843-2020. All direct to patient orders will ship complete. The entire order will ship when out-of-stock product becomes available."
Dim OutOfStockDoc As New HtmlAgilityPack.HtmlDocument
OutOfStockDoc.LoadHtml(ChromeDriver.PageSource)
Dim OutOfStockProductNodes As HtmlAgilityPack.HtmlNodeCollection = OutOfStockDoc.DocumentNode.SelectNodes("//div[contains(@id,'id_detail_item_')]")
FLPOutOfStock.SuspendLayout()
If OutOfStockProductNodes IsNot Nothing Then
For Each OutOfStockProductNode As HtmlAgilityPack.HtmlNode In OutOfStockProductNodes
Dim FLPOutOfStockProduct As New FlowLayoutPanel
FLPOutOfStockProduct.SuspendLayout()
FLPOutOfStockProduct.FlowDirection = FlowDirection.LeftToRight
FLPOutOfStockProduct.AutoSize = False
FLPOutOfStockProduct.Size = New Size(420, 160)
FLPOutOfStock.Controls.Add(FLPOutOfStockProduct)
Dim WBProductText As New WebBrowser
WBProductText.Size = New Size(400, 120)
WBProductText.AllowNavigation = False
WBProductText.AllowWebBrowserDrop = False
WBProductText.IsWebBrowserContextMenuEnabled = False
WBProductText.ScriptErrorsSuppressed = True
WBProductText.ScrollBarsEnabled = True
WBProductText.Margin = New Padding(0, 0, 0, 0)
WBProductText.Padding = New Padding(0, 0, 0, 0)
WBProductText.Navigate("about:blank")
Dim ProductTextHtmlDoc As New HtmlAgilityPack.HtmlDocument
ProductTextHtmlDoc.LoadHtml(OutOfStockProductNode.OuterHtml)
ProductTextHtmlDoc.DocumentNode.SelectSingleNode("/descendant::a[@id='patient-outOfStock-delete-item']").Remove()
WBProductText.DocumentText = ProductTextHtmlDoc.DocumentNode.OuterHtml
FLPOutOfStockProduct.Controls.Add(WBProductText)
FLPOutOfStockProduct.SetFlowBreak(WBProductText, True)
Dim SpaceReducer0 As New Panel
SpaceReducer0.Size = New Size(0, 0)
FLPOutOfStockProduct.Controls.Add(SpaceReducer0)
Dim cmdProductDeleteButton As New Button
cmdProductDeleteButton.Text = "Delete"
cmdProductDeleteButton.BackColor = Color.White
cmdProductDeleteButton.ForeColor = Color.Black
cmdProductDeleteButton.Margin = New Padding(0, 0, 0, 0)
cmdProductDeleteButton.Padding = New Padding(0, 0, 0, 0)
cmdProductDeleteButton.Size = New Size(400, 20)
Dim OnClickAttributeValueWithQuoteEscaping As String = OutOfStockProductNode.SelectSingleNode("/descendant::a[@id='patient-outOfStock-delete-item']").GetAttributeValue("onclick", "")
cmdProductDeleteButton.Tag = "//a[@id='patient-outOfStock-delete-item' and (@onclick=""" & OnClickAttributeValueWithQuoteEscaping & """)]"
AddHandler cmdProductDeleteButton.Click, AddressOf cmdProductDeleteButton_Click
FLPOutOfStockProduct.Controls.Add(cmdProductDeleteButton)
FLPOutOfStockProduct.SetFlowBreak(cmdProductDeleteButton, True)
Dim SpaceReducer1 As New Panel
SpaceReducer1.Size = New Size(0, 0)
FLPOutOfStockProduct.Controls.Add(SpaceReducer1)
FLPOutOfStockProduct.ResumeLayout()
Next
FLPOutOfStock.ResumeLayout()
FLPOutOfStock.Refresh()
End If
cmdOutOfStockDeleteAll.Enabled = True
cmdOutOfStockContinue.Enabled = True
Catch Ex As Exception
cmdOutOfStockDeleteAll.Enabled = True
cmdOutOfStockContinue.Enabled = True
End Try
End Sub
所以我被要求展示改进的clear方法中的内容。这是:
<Extension()>
Public Function ImprovedClear(ByRef Control as Control)
For Each controlchild as control in control.controls
Control.Dispose()
Next
Control.Controls.Clear()
Return Nothing
End Function
另外,对于那些想知道设置流中断并添加大小为0、0的空间缩减器面板的人来说,这是因为如果在另一个方向上有更多可用空间,则流布局面板不会按我想要的方向排列控件。例如,假设“流向”设置为“自上而下”。它将自上而下地设置布局控件,直到用完垂直空间。在此之后,它将添加一个新列,而不是添加滚动条。为了避免这种情况,我将流动方向设置为我想要的相反方向。并使用“设置流动中断”使其无法在该方向上添加更多控件。使用“设置流动中断”后,该方向上的不可见空间将添加为与“流动中断”设置为“真”后的控件大小相等。因此,添加一个大小为0的控件可以消除这一差距。能否显示FLPOutOfStock.ImprovedClear的实现?++我建议构建一个UserControl,其中包含要添加到内部FlowLayoutPanel的部分。更容易处理,不需要假分隔符这不是一个HTML页面,工作方式也不一样。这是错误的:对于control.controls control.Dispose中的每个controlchild as控件,下一步,您将处理一半的控件。使用向后的For循环。