2017-11-25 31 views
0

我使用这部分代码为标签,一个文本框一个按钮一个单选添加到面板VB.NET - 刷新面板时一些控件删除programmaticaly

Private Sub AppsAdd_Button_Click(sender As Object, e As EventArgs) Handles AppsAdd_Button.Click 
    Dim lbl As New Label() 
    Dim count As Integer = Apps_Panel.Controls.OfType(Of Label)().ToList().Count 
    lbl.Name = "AppLabel_" & (count + 1) 
    lbl.Text = "Application #" & (count + 1) & ":" 
    lbl.Location = New Point(0, 28 * count) 
    lbl.AutoSize = False 
    lbl.Size = New Size(114, 21) 
    lbl.TextAlign = ContentAlignment.MiddleRight 
    lbl.Tag = count + 1 
    Apps_Panel.Controls.Add(lbl) 

    Dim txtbox As New TextBox() 
    count = Apps_Panel.Controls.OfType(Of TextBox)().ToList().Count 
    txtbox.Name = "AppTextbox_" & (count + 1) 
    txtbox.Text = "..." 
    txtbox.Location = New Point(120, 28 * count) 
    txtbox.Size = New Size(387, 21) 
    txtbox.Tag = count + 1 
    AddHandler txtbox.TextChanged, AddressOf TextBox_Changed 
    Apps_Panel.Controls.Add(txtbox) 

    Dim btn As New Button() 
    count = Apps_Panel.Controls.OfType(Of Button)().ToList().Count 
    btn.Name = "AppBrowseButton_" & (count + 1) 
    btn.Text = "Browse" 
    btn.Location = New Point(513, 28 * count) 
    btn.Size = New Size(75, 21) 
    btn.Tag = count + 1 
    AddHandler btn.Click, AddressOf Button_Click 
    Apps_Panel.Controls.Add(btn) 

    Dim radiobtn As New RadioButton() 
    count = Apps_Panel.Controls.OfType(Of RadioButton)().ToList().Count 
    radiobtn.Name = "AppRadio_" & (count + 1) 
    radiobtn.Text = "" 
    radiobtn.Location = New Point(590, 28 * count) 
    radiobtn.Size = New Size(14, 21) 
    radiobtn.Tag = count + 1 
    AddHandler radiobtn.Click, AddressOf RadioButton_Click 
    Apps_Panel.Controls.Add(radiobtn) 
End Sub 
Private Sub TextBox_Changed(sender As Object, e As EventArgs) 
    Dim textbox As TextBox = TryCast(sender, TextBox) 
End Sub 
Private Sub Button_Click(sender As Object, e As EventArgs) 
    Dim button As Button = TryCast(sender, Button) 
End Sub 
Private Sub RadioButton_Click(sender As Object, e As EventArgs) 
    Dim RadioButton As RadioButton = TryCast(sender, RadioButton) 
    AppToDel_Label.Text = RadioButton.Tag 
End Sub 

然后我使用它来删除所选控件:

Private Sub AppsDel_Button_Click(sender As System.Object, e As System.EventArgs) Handles AppsDel_Button.Click 
    Dim Ctrl As Control 
    For controlIndex As Integer = Apps_Panel.Controls.Count - 1 To 0 Step -1 
     Ctrl = Apps_Panel.Controls(controlIndex) 
     If Ctrl.Name Like "*" & AppToDel_Label.Text Then 
      RemoveHandler Ctrl.TextChanged, AddressOf TextBox_Changed 
      RemoveHandler Ctrl.Click, AddressOf Button_Click 
      RemoveHandler Ctrl.Click, AddressOf RadioButton_Click 
      Apps_Panel.Controls.Remove(Ctrl) 
      Ctrl.Dispose() 
     End If 
    Next 
End Sub 

当所选控件位于面板的底部时,面板在删除时高度变小。但是,如果我选择从面板“列表”的顶部或中间删除,留下一个空白区域并且面板不会缩小!任何想法?无论如何刷新面板,以便它可以填补空的空间?

Here是一个视频示例。

+1

创建这些项目的用户控件可能会更容易,因此您正在创建和删除更少的项目。但无论哪种方式,从中间删除意味着您需要迭代并重新定位其余部分。 FlowLayoutPanel可以管理你的位置 – Plutonix

+0

@Plutonix非常感谢你的评论! –

回答

1

改为使用FlowLayoutPanel。控件自动添加到该控件的FlowLayoutPanel布局。它可以水平或垂直排列项目。 添加它们时不指定位置,而是使用边距和填充。

我也会将一行(标签,文本框,按钮和RadioButton)的所有控件合并为一个UserControl。这允许您以可视方式而不是以编程方式设计行。

Walkthrough: Arranging Controls on Windows Forms Using a FlowLayoutPanel

Working with Windows Forms FlowLayoutPanel(C#Corner)。

+0

非常感谢Olivier的一切,你真的帮助了我! –