2013-11-18 2 views
2

Надстройка работает правильноTableLayoutPanel не удаление элементов управления

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 

Функция Remove однако не

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 является ret urning «Nothing». Я начал с матрицы 2x2, и после добавления столбца я правильно имел матрицу 2x3 с кнопкой. После удаления я неправильно имею матрицу 3x2 того же набора кнопок. Я попытался использовать утилиту управления, прежде чем понял, что GetControl возвращает «Nothing».

User Control output

Спасибо за любую помощь.

+0

Ну вот загвоздка GetControlFromPosition не работает, как мы могли бы подумать. Добавьте еще одну функцию, которая проходит через все ячейки, просматривающие каждую из ячеек. См. Решение – garaber

+0

Если вы хотите удалить все элементы управления, вы можете использовать 'Me.m_TblLyBtnHost.Controls.Clear()'; или если вы хотите быть более избирательным (выбирая определенные элементы управления для удаления), вы можете перебирать все содержащиеся элементы управления ('Me.m_TblLyBtnHost.Controls). – varocarbas

+0

Нет Только последний столбец или строка. Все, кроме Idle_Mind, поймало мои ошибки. И я направлялся к тому, что, как я думал, был заслуженной яростью. :) – garaber

ответ

2

Некоторые общие замечания:

  • Вы должны явно увеличения/уменьшения ColumnCount() недвижимость.
  • Свойство ColumnStyle() Width не должно быть фактическим вычисленным процентом. Просто сделайте, чтобы все столбцы имели значение . Я использовал любое значение в первом столбце. С учетом этого вам не нужно менять ни одну из Ширин при удалении столбца , так как они уже имеют одинаковое значение.
  • У вас была ошибка «выключена на один» в значении «Столбец» для процедуры «Добавить»() .
  • В процедуре Remove() ваши параметры строки/столбца были Обратный в 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 
+0

Да, я поймал, что LOL. В бессмертных словах лесной гумп, «глупость такая же глупая. Спасибо, что нашли время. Также были некоторые из вас, которые я не понимал, спасибо – garaber

+0

Мы все были там, мой друг. Солдат!! –

+0

Да, я видел ваш комментарий LOL пытается покрыть глупые треки – garaber