Удалите указанную c строку TableLayoutPanel, используя динамически создаваемую кнопку каждой строки - PullRequest
0 голосов
/ 08 января 2020

Итак, я делаю функцию, которая заполняет TableLayoutPanel из FileDialog Result, а затем создает кнопку удаления для каждой строки, используя al oop. Вот код

Private PathtoFile1 As New List(Of String)  'this will contain all the selected file in the dialogwindow
Private rowLineDrawing As Integer = 0
Private selectedfilecountLineDrawing As Integer


Public Function AttachFileLineDrawing(TLP As TableLayoutPanel)
    Dim dr = OpenFileDialog1.ShowDialog

    If (dr = System.Windows.Forms.DialogResult.OK) Then
        selectedfilecountLineDrawing = OpenFileDialog1.FileNames.Count


        For Each FileName In OpenFileDialog1.FileNames
            Try
                Console.WriteLine(FileName.ToString)
                PathtoFile1.Add(FileName.ToString)
            Catch SecEx As Security.SecurityException
                MessageBox.Show("Security error. Please contact your administrator for details.\n\n" &
               "Error message: " & SecEx.Message & "\n\n" &
               "Details (send to Support):\n\n" & SecEx.StackTrace)
            Catch ex As Exception
                'Could Not Load the image - probably permissions-related.
                MessageBox.Show(("Cannot display the image: " & FileName.Substring(FileName.LastIndexOf("\"c)) &
                ". You may not have permission to read the file, or " + "it may be corrupt." _
                & ControlChars.Lf & ControlChars.Lf & "Reported error: " & ex.Message))
            End Try
        Next

        'MAKE SOMETHING HERE TO DISPLAY THE SELECTED ITEMS IN THE TABLELAYOUTPANEL OF THE SUBMIT PROGRESS 
        TLP.Controls.Clear()
        TLP.RowCount = 0
        rowLineDrawing = 0
        For Each Path In PathtoFile1

            Dim filepath As New Label
            filepath.Text = Path
            filepath.Width = Val(360)

            'this button is for previewing the file
            Dim btnPreview As New Button

            AddHandler btnPreview.Click,
                Sub(s As Object, e As EventArgs)
                    Dim btn = CType(s, Button)
                    MsgBox("This is Preview")

                End Sub

            'This button is for removing rows in the tablelayoutpanel
            Dim btnRmv As New Button



            Dim StringToIndex As String = Path  'THIS CATCHES EVERY PATH IN THE LOOP AND STORE IT TO THE VARIABLE WHICH THEN BE USED AS A COMPARABLE PARAMETER FOR THE INDEX SEARCH
            Dim index = PathtoFile1.IndexOf(Path)
            AddHandler btnRmv.Click,
                Sub(s As Object, e As EventArgs)
                    Dim btn = CType(s, Button)
                    MsgBox(index)
                    PathtoFile1.RemoveAt(index) 'THIS LINE OF CODE REMOVE THE SPECIFIC ITEM IN THE LIST USING THE  BTNRMV CLICK

                    'MAKE SOMETHING HERE TO REMOVE THE ROW IN THE TABLELAYOUTAPANEL 

                End Sub



            TLP.SuspendLayout()
            TLP.RowStyles.Add(New RowStyle(SizeType.Absolute, 20))
            TLP.Controls.Add(filepath, 0, rowLineDrawing)
            TLP.Controls.Add(btnPreview, 1, rowLineDrawing)
            TLP.Controls.Add(btnRmv, 2, rowLineDrawing)
            TLP.ResumeLayout()
            rowLineDrawing -= -1

        Next
    End If
End Function

Итак, я пытаюсь удалить строку в TableLayoutPanel вместе с элементом управления dynamici c. Мой подход заключается в удалении выбранного элемента в списке, и я достиг его правильно, но не могу удалить строку в TableLayoutPanel. Любая помощь очень ценится!

РЕДАКТИРОВАТЬ

Я пытался использовать предоставленный модуль выше, но получил эту ошибку

enter image description here

И получил эту ошибку

enter image description here

1 Ответ

0 голосов
/ 08 января 2020

Вот метод расширения, который позволит вам удалить любую строку из TableLayoutPanel по индексу:

Imports System.Runtime.CompilerServices

Public Module TableLayoutPanelExtensions

    <Extension>
    Public Sub RemoveRowAt(source As TableLayoutPanel, index As Integer)
        If index >= source.RowCount Then
            Throw New ArgumentOutOfRangeException(NameOf(index),
                                                  index,
                                                  "The row index must be less than the number of rows in the TableLayoutPanel control.")
        End If

        'Remove the controls in the specified row.
        For columnIndex = 0 To source.ColumnCount - 1
            Dim child = source.GetControlFromPosition(columnIndex, index)

            If child IsNot Nothing Then
                child.Dispose()
            End If
        Next

        'Move controls below the specified row up.
        For rowIndex = index + 1 To source.RowCount - 1
            For columnIndex = 0 To source.ColumnCount - 1
                Dim child = source.GetControlFromPosition(columnIndex, rowIndex)

                If child IsNot Nothing Then
                    source.SetCellPosition(child, New TableLayoutPanelCellPosition(columnIndex, rowIndex - 1))
                End If
            Next
        Next

        'Remove the last row.
        source.RowCount -= 1
    End Sub

End Module

Я проверил это на 3 столбцах на 4 строки TableLayoutPanel, содержащих Label в каждой ячейке дважды выполнялся следующий код:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    TableLayoutPanel1.RemoveRowAt(1)
End Sub

Результат был таким, как ожидалось, т.е. каждый раз удалял строку сверху вниз. Возможно, вам придется немного поиграться, в зависимости от того, что вы хотите, чтобы высота строк. Высота строк была установлена ​​равной процентной доле, поэтому оставшиеся строки росли пропорционально, чтобы заполнить пространство. Если вы хотите что-то другое, вы можете добавить код соответственно. Обратите внимание, что вы можете создать практически идентичный метод удаления столбцов.

...