Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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 FlowLayoutPanel清除后不显示多个控件_Vb.net_Winforms_Controls_Flowlayoutpanel - Fatal编程技术网

Vb.net FlowLayoutPanel清除后不显示多个控件

Vb.net FlowLayoutPanel清除后不显示多个控件,vb.net,winforms,controls,flowlayoutpanel,Vb.net,Winforms,Controls,Flowlayoutpanel,我的程序使用selenium、HTTP请求和一个称为HtmlAgilityPack的HTML解析器自动化网站上的进程 此过程中有一些部分需要用户输入,而这些输入不能由硬编码值自动填写。允许用户控制网站填写这些输入将是一个错误。这将很难知道他们什么时候完成了输入,他们可能会触摸一些他们不应该触摸的东西,这将在网站控制权移交给程序时导致错误 相反,我使用selenium下载网站的页面源代码,并使用HtmlAgilityPack解析HTML中的输入。然后动态生成与这些输入匹配的控件,并将其添加到Flo

我的程序使用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方法

我意识到清除方法在它们被处理后是不必要的,它只是一个备份,因为任何东西似乎都不起作用。我想确保面板完全复位

代码如下:

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循环。