【问题标题】:TableLayoutPanel isn't removing ControlsTableLayoutPanel 没有删除控件
【发布时间】:2013-11-18 17:22:37
【问题描述】:

添加工作正常

Private Sub AddColumnToTableLayout()
    Me.m_TblLyBtnHost.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, (100 / m_TblLyBtnHost.ColumnCount)))
    For iColumnStyle As Integer = 0 To Me.m_TblLyBtnHost.ColumnStyles.Count - 1
        Me.m_TblLyBtnHost.ColumnStyles.Item(iColumnStyle).SizeType = SizeType.Percent
        Me.m_TblLyBtnHost.ColumnStyles.Item(iColumnStyle).Width = 100 / Me.m_TblLyBtnHost.ColumnCount
    Next

    'For iColumns As Integer = 0 To m_TblLyBtnHost.ColumnCount - 1
    '    Me.m_TblLyBtnHost.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, (100 / m_TblLyBtnHost.ColumnCount)))
    'Next
    'Insert buttons for each of the new row ends
    For iRowIndex As Integer = 0 To Me.m_TblLyBtnHost.RowCount - 1
        m_btnMy = New MyButton.MyButton
        Me.SetDefaultsOnMyButtonMyButton(m_btnMy, Me.m_TblLyBtnHost.ColumnCount, iRowIndex)
        Me.m_TblLyBtnHost.Controls.Add(m_btnMy, Me.m_TblLyBtnHost.ColumnCount, iRowIndex)
    Next

End Sub

MyButton.MyButton 在 UserControl 的类中声明为

Friend WithEvents m_btnMy As MyButton.MyButton

但删除功能不是

Private Sub RemoveColumnFromTableLayout()
    For iRowIndex As Integer = 0 To Me.m_TblLyBtnHost.RowCount - 1
        Dim Ctrl As MyButton.MyButton = Me.m_TblLyBtnHost.GetControlFromPosition(iRowIndex, Me.m_TblLyBtnHost.ColumnCount - 1)
        Me.m_TblLyBtnHost.Controls.Remove(Ctrl)
    Next
    Me.m_TblLyBtnHost.ColumnStyles.RemoveAt(Me.m_TblLyBtnHost.ColumnCount - 1)
    For iColumnIndex As Integer = 0 To Me.m_TblLyBtnHost.ColumnStyles.Count - 1
        Me.m_TblLyBtnHost.ColumnStyles.Item(iColumnIndex).Width = 100 / Me.m_TblLyBtnHost.ColumnCount
    Next
End Sub

在逐步执行 RemoveColumnFromTableLayout() 时,我注意到 GetControlFromPosition 返回“Nothing”。我从一个 2x2 矩阵开始,添加一列后,我正确地拥有了一个带按钮的 2x3 矩阵。删除后,我不正确地设置了相同按钮集的 3x2 矩阵。在我意识到 GetControl 返回“Nothing”之前,我尝试在控件上使用 dispose。

感谢您的帮助。

【问题讨论】:

  • 这就是问题所在 GetControlFromPosition 没有像我们想象的那样工作。添加另一个函数,该函数逐步遍历所有单元格,查看每个单元格。查看解决方案
  • 如果要删除所有控件可以使用Me.m_TblLyBtnHost.Controls.Clear();或者,如果您想更有选择性(选择要删除的某些控件),您可以遍历所有包含的控件(`Me.m_TblLyBtnHost.Controls)。
  • 否 只是最后一列或最后一行。除了 Idle_Mind 之外的任何东西都抓住了我的错误。我正朝着我认为当之无愧的愤怒前进。 :)
  • 好的。我对 TableLayoutPanel 没有太多经验,但我很好奇你没有得到任何答案,这就是我评论的东西。很高兴你得到了一些帮助; +1 为 Idle_Mind 提供现场解决方案并写出如此清晰详细的答案。

标签: vb.net tablelayoutpanel


【解决方案1】:

一些一般说明:

  • 您必须显式增加/减少 ColumnCount() 财产。
  • ColumnStyle() Width 属性不需要是实际的 计算百分比。只需使所有列具有相同 价值。我使用了第一列中的任何值。接着就,随即 请记住,当列是 已删除,因为它们已经是相同的值了。
  • Add() 的列值中出现“减一”错误 例行公事。
  • 在 Remove() 例程中,您的 row/col 参数在 GetControlFromPosition() 电话。

这是修改后的代码:

Private Sub AddColumnToTableLayout()
    Me.m_TblLyBtnHost.ColumnCount = Me.m_TblLyBtnHost.ColumnCount + 1
    Me.m_TblLyBtnHost.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, Me.m_TblLyBtnHost.ColumnStyles(0).Width))

    'Insert buttons for each of the new row ends
    For iRowIndex As Integer = 0 To Me.m_TblLyBtnHost.RowCount - 1
        m_btnMy = New MyButton.MyButton
        Me.SetDefaultsOnMyButtonMyButton(m_btnMy, Me.m_TblLyBtnHost.ColumnCount - 1, iRowIndex)
        Me.m_TblLyBtnHost.Controls.Add(m_btnMy, Me.m_TblLyBtnHost.ColumnCount - 1, iRowIndex)
    Next

End Sub

Private Sub RemoveColumnFromTableLayout()
    For iRowIndex As Integer = 0 To Me.m_TblLyBtnHost.RowCount - 1
        Me.m_TblLyBtnHost.GetControlFromPosition(Me.m_TblLyBtnHost.ColumnCount - 1, iRowIndex).Dispose()
    Next
    Me.m_TblLyBtnHost.ColumnStyles.RemoveAt(Me.m_TblLyBtnHost.ColumnCount - 1)
    Me.m_TblLyBtnHost.ColumnCount = Me.m_TblLyBtnHost.ColumnCount - 1
End Sub

【讨论】:

  • 是的,我抓住了那个 LOL。用森林甘普的不朽名言,“愚蠢就是愚蠢。感谢您抽出宝贵时间。还有一些我没有意识到的观点,谢谢
  • LOL 老潜艇水手明白一个 ROFL
  • 在 CS 中闲置你。我的旧踩踏地
  • 酷!...我妻子最后一次驻扎在彼得森空军基地。当她去土耳其进行为期一年的远程旅行时,我仍然住在基地里。我在斯普林斯断断续续地度过了 11 年。
  • 代我向派克峰问好。哈哈。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 2013-04-19
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多