tablelayoutpanel не поднимает событие cellpaint

Я пытаюсь раскрасить ряды объекта tablelayoutpanel. Я добавил обработчик для события cellpaint, но я даже не могу заставить отладчик перехватить это событие. Есть ли что-то еще, что мне нужно настроить на табличной панели, чтобы я мог покрасить свои ячейки?

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

Вот мой код:

 Private Sub TableLayoutPanel3_CellPaint(sender As Object, e As TableLayoutCellPaintEventArgs) Handles TableLayoutPanel3.CellPaint
    Select Case e.Row
        Case 1
            e.Graphics.FillRectangle(Brushes.Orange, e.CellBounds)
        Case 2
            e.Graphics.FillRectangle(Brushes.Green, e.CellBounds)
        Case 3
            e.Graphics.FillRectangle(Brushes.Yellow, e.CellBounds)
    End Select
End Sub

Я использовал эту другую тему в качестве ссылки.

Редактировать: объекты в ячейках моей табличной панели не были настроены на автоматический размер. Когда я включил авторазмер, я обнаружил, что событие cellpaint будет вызываться, и мой объект визуально отображался, как я и ожидал. Я предполагаю, что это поведение разработано.

Авторазмер объекта ячейки true против false блокирует событие cellpaint

1 ответ

Решение

Чтобы загрузить UserControl во время выполнения, я создам кнопку, чтобы вызвать это. Я мог бы сделать это на Form_Load, но для этого примера я сделаю это на Button_Click.

У меня есть следующие файлы:

  • Form1.vb
  • UserControl1.vb

Form1.vb

В моем Form1.vb У меня есть TableLayoutPanel (используется для изменения размера элементов управления). В первой строке моего TableLayoutPanel у меня есть кнопка, которая уведомляет пользователя "Загрузить пользовательский элемент управления". Второй ряд - это место для моего UserControl.

Form1.vb

Следующий код просто добавляет UserControl1, который я создал, в мой TableLayoutPanel

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim ucColors As New UserControl1 'Create a new instance of the UserControl
        ucColors.Dock = DockStyle.Fill 'Make it dock to it's parent container (this tablelayoutpanel)
        TableLayoutPanel1.Controls.Add(ucColors, 0, 1) 'Add the control to the tablelayoutpanel
    End Sub
End Class

UserControl1.vb

Это мой UserControl1.vb. Я создал TableLayoutPanel в этом пользовательском элементе управления и закрепил его (заполните). Это заставляет TableLayoutPanel изменить размер до размера UserControl. Я создал три строки, потому что у вас было три строки в вашем примере.

UserControl1.vb

Это единственный код, который мне нужен для рисования UserControl> TableLayoutPanels> Rows.

Public Class UserControl1
    Private Sub TableLayoutPanel1_CellPaint(sender As Object, e As TableLayoutCellPaintEventArgs) Handles TableLayoutPanel1.CellPaint
        Select Case e.Row
            Case 0 'Row 1
                e.Graphics.FillRectangle(Brushes.Orange, e.CellBounds)
            Case 1 'Row 2
                e.Graphics.FillRectangle(Brushes.Green, e.CellBounds)
            Case 2 'Row 3
                e.Graphics.FillRectangle(Brushes.Yellow, e.CellBounds)
            End Select
    End Sub
End Class

RunTime

Когда я выполняю свою программу, появляется Form1:

Form1_BeforeClick

И тогда, когда я нажимаю кнопку Загрузить, это происходит:

Form1_AfterClick


Итак, когда я нажал на кнопку, был создан новый экземпляр пользовательского элемента управления, который заставил его выполнить Cell_Paint в UserControl.

Надеюсь, это прояснит ситуацию!

Другие вопросы по тегам