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

所以我被要求展示改进的 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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...