2016-08-22 8 views
0

私の問題は単純です。私はTableLayoutPanelを持っていて、その中にさまざまな行があり、それぞれにコントロールが入っています。コンテンツが表示されていないときに自動サイズのTableLayoutPanel行が折りたたまれないようにする

VisibleプロパティがFalseに設定されている場合を除いて、内容に基づいてTableLayoutPanelのサイズを自動的に変更します。

このような状況が発生した場合、その行が空白のままにしておきたいと思います。

現在、コントロールの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

私はもともと持っていました@ハーンを試したsパッサントのコメントは役に立たない。しかし、これをやり直すためのコードを書いているうちに、私は成功を収めていたので、もともと間違っていたことは分かりません。

この結果、この解決法はやりがいのあるようですが、これを行うより良い方法があれば、私はそれを聞いてうれしいです。

完全なコードは、以下である:

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 
関連する問題