2016-08-22 46 views
0

我的問題很簡單。我有一個TableLayoutPanel,其中有不同的行,每個包含控件。防止自動調整大小的TableLayoutPanel行在內容不可見時崩潰

我希望TableLayoutPanel根據其內容自動調整自身大小,除非控件的Visible屬性設置爲False

發生這種情況時,我想保留該行所在的空格。

當前,當控件的Visible屬性設置爲False時,它所在的行摺疊。如果我檢查調試器,我可以看到控件的Height仍然是24,而不是0

我一直在玩弄不同的設置無濟於事,谷歌搜索的問題似乎只是發現人們問如何實現我正在嘗試做的完全相反。

的簡單例子的完整代碼如下:

Form1.vb的

Option Strict On 
Option Explicit On 
Option Infer Off 

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     For i As Integer = 0 To 2 
      Dim c As New CheckBox() 
      c.Text = "Checkbox" & i+1 

      If i = 0 
       AddHandler c.CheckedChanged, Sub(sender2 As Object, e2 As EventArgs) 
                If TryCast(sender2, CheckBox).Checked 
                 TryCast(TableLayoutPanel1.Controls(1), CheckBox).Visible = False 
                Else 
                 TryCast(TableLayoutPanel1.Controls(1), CheckBox).Visible = True 
                End If 
               End Sub 
      End If 

      TableLayoutPanel1.Controls.Add(c) 
     Next 
    End Sub 
End Class 

Form1.Designer.vb

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 
Partial Class Form1 
    Inherits System.Windows.Forms.Form 

    'Form overrides dispose to clean up the component list. 
    <System.Diagnostics.DebuggerNonUserCode()> _ 
    Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
     Try 
      If disposing AndAlso components IsNot Nothing Then 
       components.Dispose() 
      End If 
     Finally 
      MyBase.Dispose(disposing) 
     End Try 
    End Sub 

    'Required by the Windows Form Designer 
    Private components As System.ComponentModel.IContainer 

    'NOTE: The following procedure is required by the Windows Form Designer 
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor. 
    <System.Diagnostics.DebuggerStepThrough()> _ 
    Private Sub InitializeComponent() 
     Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel() 
     Me.SuspendLayout 
     ' 
     'TableLayoutPanel1 
     ' 
     Me.TableLayoutPanel1.AutoSize = true 
     Me.TableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink 
     Me.TableLayoutPanel1.ColumnCount = 1 
     Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle()) 
     Me.TableLayoutPanel1.Location = New System.Drawing.Point(13, 13) 
     Me.TableLayoutPanel1.Name = "TableLayoutPanel1" 
     Me.TableLayoutPanel1.RowCount = 3 
     Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle()) 
     Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle()) 
     Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle()) 
     Me.TableLayoutPanel1.Size = New System.Drawing.Size(0, 0) 
     Me.TableLayoutPanel1.TabIndex = 0 
     ' 
     'Form1 
     ' 
     Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!) 
     Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font 
     Me.ClientSize = New System.Drawing.Size(284, 261) 
     Me.Controls.Add(Me.TableLayoutPanel1) 
     Me.Name = "Form1" 
     Me.Text = "Form1" 
     Me.ResumeLayout(false) 
     Me.PerformLayout 

    End Sub 
    Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel 

End Class 
+0

異常請求。我懷疑你真的*尋找的是TLP的MinimumSize屬性,所以它不能縮小太多。如果不是,則必須添加代碼以在AutoSize和Absolute之間翻轉RowStyle.SizeType屬性。 –

回答

0

我本來嘗試@Han sPassant的評論無濟於事。然而,在編寫代碼嘗試再次嘗試時,我很成功,所以我不確定我最初做錯了什麼。

因此,這個解決方案似乎有訣竅,但如果有更好的方法去做這件事,我很樂意聽到它。

完整代碼如下:

Form1.vb的

Option Strict On 
Option Explicit On 
Option Infer Off 

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     TableLayoutPanel1.SuspendLayout() 
     TableLayoutPanel1.Visible = False 

     TableLayoutPanel1.RowStyles.Clear() 

     For i As Integer = 0 To 2 
      TableLayoutPanel1.RowStyles.Add(New RowStyle(SizeType.AutoSize)) 


      Dim c As New CheckBox() 
      c.Text = "Checkbox" & i+1 

      If i = 0 
       AddHandler c.CheckedChanged, Sub(sender2 As Object, e2 As EventArgs) 
                If TryCast(sender2, CheckBox).Checked 
                 TryCast(TableLayoutPanel1.Controls(1), CheckBox).Visible = False 
                Else 
                 TryCast(TableLayoutPanel1.Controls(1), CheckBox).Visible = True 
                End If 
               End Sub 
      End If 

      TableLayoutPanel1.Controls.Add(c, 0, i) 
     Next 

     TableLayoutPanel1.Visible = True 

     TableLayoutPanel1.ResumeLayout() 

     For i As Integer = 0 To TableLayoutPanel1.RowStyles.Count-1 
      TableLayoutPanel1.RowStyles(i).SizeType = SizeType.Absolute 
      TableLayoutPanel1.RowStyles(i).Height = TableLayoutPanel1.Controls(i).GetPreferredSize(New Size(0, 0)).Height + TableLayoutPanel1.Controls(i).Margin.Top + TableLayoutPanel1.Controls(i).Margin.Bottom 
     Next 
    End Sub 
End Class 

Form1.Designer.vb

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 
Partial Class Form1 
    Inherits System.Windows.Forms.Form 

    'Form overrides dispose to clean up the component list. 
    <System.Diagnostics.DebuggerNonUserCode()> _ 
    Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
     Try 
      If disposing AndAlso components IsNot Nothing Then 
       components.Dispose() 
      End If 
     Finally 
      MyBase.Dispose(disposing) 
     End Try 
    End Sub 

    'Required by the Windows Form Designer 
    Private components As System.ComponentModel.IContainer 

    'NOTE: The following procedure is required by the Windows Form Designer 
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor. 
    <System.Diagnostics.DebuggerStepThrough()> _ 
    Private Sub InitializeComponent() 
     Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel() 
     Me.SuspendLayout 
     ' 
     'TableLayoutPanel1 
     ' 
     Me.TableLayoutPanel1.AutoSize = True 
     Me.TableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink 
     Me.TableLayoutPanel1.ColumnCount = 1 
     Me.TableLayoutPanel1.Location = New System.Drawing.Point(13, 13) 
     Me.TableLayoutPanel1.Name = "TableLayoutPanel1" 
     Me.TableLayoutPanel1.RowCount = 1 
     Me.TableLayoutPanel1.Size = New System.Drawing.Size(0, 0) 
     Me.TableLayoutPanel1.TabIndex = 0 
     ' 
     'Form1 
     ' 
     Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!) 
     Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font 
     Me.ClientSize = New System.Drawing.Size(284, 261) 
     Me.Controls.Add(Me.TableLayoutPanel1) 
     Me.Name = "Form1" 
     Me.Text = "Form1" 
     Me.ResumeLayout(false) 
     Me.PerformLayout 

End Sub 
    Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel 

End Class 
相關問題