如何解决FlowLayoutPanel 清除后不显示多个控件
我的程序使用 selenium、HTTP 请求和称为 HtmlAgilityPack 的 HTML 解析器自动执行网站上的流程。
此过程的某些部分需要用户输入,而硬编码值无法自动填写。允许用户控制网站填写这些输入将是一个错误。很难知道他们何时完成了输入,他们可能会触摸一些他们不应该触摸的东西,这会在将网站控制权交还给程序时导致错误。
相反,我使用 selenium 下载网站的页面源代码,并使用 HtmlAgilityPack 从 HTML 中解析输入。然后动态生成与这些输入匹配的控件并将其添加到 FlowLayoutPanel。 FlowLayoutPanel 第一次正常工作。它显示所有添加的控件。当用户完成后,他们点击一个按钮,过程继续。
有时进程会遇到错误,导致它循环回到用户需要再次输入的地方。之前工作的确切代码然后再次在同一个子例程中运行。这一切都按预期运行,没有错误。我在运行时手动检查了控件是否已添加到 FlowLayoutPanel,它们的大小是否大于 0、0,并且它们是可见的颜色。然而,无论有多少控件应该可见,FlowLayoutPanel 中只会显示一个控件。
FlowLayoutPanel 的 AutoScroll
属性设置为 true
,并且有足够的空间来添加更多控件。正如我所说,这第一次工作正常,而不是第二次。我已经坚持了一段时间,希望得到一些帮助。代码会贴在下面给大家看看。
我要发布的代码有几个 FlowLayoutPanel。一个永久存在于在设计器中创建的 Form 上,而其他的则是动态生成的以对控件进行分组。
问题是永久的。正如我所说,它显示了一个控件。此控件是第一个动态生成的流布局面板及其所有子项。它不显示添加到其中的任何其他 FlowLayoutPanel 控件。以先添加的为准。
对于那些对下面代码中的 FLPOutOfStock.ImprovedClear()
行感到疑惑的人,The .Improved clear 是我编写的扩展方法。使用普通方法 .Clear()
清除 FlowLayoutPanel 时,控件会被删除,但不会被处理掉。我的方法处理面板中的所有控件,然后调用面板上的 Clear()
方法。
我意识到 Clear()
方法在它们被处理掉之后就不是必需的,它只是一个备份,因为似乎没有任何效果。我想确保面板完全重置。
代码如下:
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)
WBProductText.Padding = New Padding(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)
cmdProductDeleteButton.Padding = New Padding(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
<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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。