Сбивается разметка внутри контрола - Visual Basic .NET
Формулировка задачи:
В одном из блоков программы есть необходимость вывода контактов на экран в виде визиток. Визитки состоят из контролов:
1. Тело визитки - это Panel
2. Внутри 1 PictureBox для фотографии контакта
3. Так же внутри 4 Label - это Фамилия, имя, отчество и порядковый номер.
Первые 141 визитка создаются как надо. На 142-й происходит какой-то сбой. Никак не могу разобраться в чем причина. Если кто может помочь подскажите пожалуйста в чем может быть дело. Возможно слишком много контролов создаются? Тогда как еще можно реализовать идею. Это собственно код, создающий визитки:
Листинг программы
- Private HCard As Integer ' для вычисления количества визиток, которые можно расположить по горизонтали
- Private PeopleList(20, 2) As Bitmap
- Private PplCardsWidth As Integer = 360 'ширина и высота будущих визиток
- Private PplCardsHeight As Integer = 230
- Public Sub Add_People()
- Dim N As Integer = 200 'k-vo vizitok
- Dim NewPanel(N) As Panel 'telo vizitki
- Dim NewNum(N) As Label 'nomer dogovora ili ID
- Dim NewPhoto(N) As PictureBox 'foto kontakta
- Dim NewFIO(N, 3) As Label 'fio kontakta
- Dim Interval As Integer = 5 ' otstup
- Dim ImagesList(14) As Image 'massiv доступных fonov vizitok
- Dim P as integer ' dlya proverki и поиска ошибки
- ReDim PeopleList(N, 2) ' spisok присвоенных фонов для визитки, предполагается сделать "анимацию" при нажатии
- HCard = Math.Truncate((TabControl1.TabPages(0).Width - 18) / (PplCardsWidth + 10))
- ImagesList(0) = My.Resources.C00
- ImagesList(1) = My.Resources.VC010
- ImagesList(2) = My.Resources.VC020 ' i tak 14 fonov
- For Cnt As Integer = 0 To N
- p = Interval + 230 * Cnt
- PeopleList(Cnt, 0) = ImagesList(Rnd() * 14)
- NewPanel(Cnt) = New Panel
- NewPanel(Cnt).Left = Interval
- NewPanel(Cnt).Top = p
- NewPanel(Cnt).Width = PplCardsWidth
- NewPanel(Cnt).Height = PplCardsHeight
- NewPanel(Cnt).BackColor = Color.Transparent
- NewPanel(Cnt).BackgroundImage = PeopleList(Cnt, 0)
- NewPanel(Cnt).BackgroundImageLayout = ImageLayout.Stretch
- NewPanel(Cnt).Name = "People" & Cnt
- NewPanel(Cnt).Tag = Cnt
- Me.TabControl1.TabPages(0).Controls.Add(NewPanel(Cnt))
- If p <> NewPanel(Cnt).Top Then
- k = "gyhgy" 'на 142 визитке начинаются расхождения, как и почему???
- End If
- NewNum(Cnt) = New Label
- NewNum(Cnt).Text = Cnt
- NewNum(Cnt).Top = Interval * 1.5
- NewNum(Cnt).Left = NewPanel(Cnt).Width / 2
- Me.TabControl1.TabPages(0).Controls(Cnt).Controls.Add(NewNum(Cnt))
- NewPhoto(Cnt) = New PictureBox
- NewPhoto(Cnt).Left = 37
- NewPhoto(Cnt).Top = 47
- NewPhoto(Cnt).Width = 111
- NewPhoto(Cnt).Height = 111
- NewPhoto(Cnt).BackColor = Color.Transparent
- NewPhoto(Cnt).BackgroundImage = My.Resources.Male
- NewPhoto(Cnt).BackgroundImageLayout = ImageLayout.Zoom
- Me.TabControl1.TabPages(0).Controls(Cnt).Controls.Add(NewPhoto(Cnt))
- NewFIO(Cnt, 1) = New Label
- NewFIO(Cnt, 1).Left = 160
- NewFIO(Cnt, 1).Top = 62
- NewFIO(Cnt, 1).Width = 200
- NewFIO(Cnt, 1).Height = 30
- NewFIO(Cnt, 1).Text = "Ivanov"
- NewFIO(Cnt, 1).Font = New System.Drawing.Font("Microsoft Sans Serif", 18)
- Me.TabControl1.TabPages(0).Controls(Cnt).Controls.Add(NewFIO(Cnt, 1))
- NewFIO(Cnt, 2) = New Label
- NewFIO(Cnt, 2).Left = 160
- NewFIO(Cnt, 2).Top = 95
- NewFIO(Cnt, 2).Width = 200
- NewFIO(Cnt, 2).Height = 25
- NewFIO(Cnt, 2).Text = "Vasilij"
- NewFIO(Cnt, 2).Font = New System.Drawing.Font("Microsoft Sans Serif", 14)
- Me.TabControl1.TabPages(0).Controls(Cnt).Controls.Add(NewFIO(Cnt, 2))
- NewFIO(Cnt, 3) = New Label
- NewFIO(Cnt, 3).Left = 160
- NewFIO(Cnt, 3).Top = 125
- NewFIO(Cnt, 3).Width = 200
- NewFIO(Cnt, 3).Height = 25
- NewFIO(Cnt, 3).Text = "Petrovich"
- NewFIO(Cnt, 3).Font = New System.Drawing.Font("Microsoft Sans Serif", 14)
- Me.TabControl1.TabPages(0).Controls(Cnt).Controls.Add(NewFIO(Cnt, 3))
- With NewPanel(Cnt)
- AddHandler .Click, AddressOf but_Click
- AddHandler .MouseHover, AddressOf but_Hoover
- AddHandler .MouseLeave, AddressOf but_Leave
- AddHandler .MouseDown, AddressOf but_MouseDown
- AddHandler .MouseUp, AddressOf but_MouseUp
- AddHandler .MouseMove, AddressOf but_MouseMove
- End With
- Next
- End Sub
Решение задачи: «Сбивается разметка внутри контрола»
textual
Листинг программы
- Public Class Form2
- Private nRow As Integer
- Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- vCard.vcWidth = 360
- vCard.vcHeight = 230
- vCard.vcMargin = 5
- nRow = 2
- With TableLayoutPanel1
- .ColumnCount = 2
- .Width = (vCard.vcWidth + vCard.vcMargin * 2) * .ColumnCount
- .Height = (vCard.vcHeight + vCard.vcMargin * 2) * nRow
- End With
- End Sub
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
- Dim crd As vCard
- Dim k As Integer
- For i = 0 To nRow - 1
- For j = 0 To TableLayoutPanel1.ColumnCount - 1
- crd = New vCard
- With crd
- .BackColor = Color.LightYellow
- .nameLast = "Иванов " & i.ToString & j.ToString
- .nameFirst = "Иван " & i.ToString & j.ToString
- .namePatronymic = "Иванович " & i.ToString & j.ToString
- .photo = ImageList1.Images(k)
- .createCard()
- End With
- TableLayoutPanel1.Controls.Add(crd)
- k += 1
- Next
- Next
- End Sub
- End Class
- Public Class vCard
- Inherits Panel
- Private lbLst, lbFst, lbPtr As Label
- Private pnPhoto As Panel
- Public Sub New()
- MyBase.New()
- Me.Width = _vcWidth
- Me.Height = _vcHeight
- Me.BorderStyle = Windows.Forms.BorderStyle.Fixed3D
- Me.Margin = New Padding(_vcMargin)
- _pnW = 100
- _pnH = 120
- End Sub
- Public Shared Property vcWidth As Integer
- Public Shared Property vcHeight As Integer
- Public Shared Property vcMargin As Integer
- Public Property nameLast As String 'фамилия
- Public Property nameFirst As String 'имя
- Public Property namePatronymic As String 'отчество
- Public Property photo As Image
- Public Property pnW As Integer
- Public Property pnH As Integer
- Public Sub createCard()
- addNmLast()
- addNmFirst()
- addNmPatronymic()
- addPhoto()
- End Sub
- Private Sub addNmLast()
- lbLst = New Label
- With lbLst
- .Text = _nameLast
- .AutoSize = True
- .Font = New Font("Arial", 12)
- .Left = 160
- .Top = 62
- End With
- Me.Controls.Add(lbLst)
- End Sub
- Private Sub addNmFirst()
- lbFst = New Label
- With lbFst
- .Text = _nameFirst
- .AutoSize = True
- .Font = New Font("Arial", 12)
- .Left = 160
- .Top = 95
- End With
- Me.Controls.Add(lbFst)
- End Sub
- Private Sub addNmPatronymic()
- lbPtr = New Label
- With lbPtr
- .Text = _namePatronymic
- .AutoSize = True
- .Font = New Font("Arial", 12)
- .Left = 160
- .Top = 125
- End With
- Me.Controls.Add(lbPtr)
- End Sub
- Private Sub addPhoto()
- pnPhoto = New Panel
- With pnPhoto
- .Width = _pnW
- .Height = _pnH
- .BackgroundImage = photo
- .BackgroundImageLayout = ImageLayout.Stretch
- .BorderStyle = Windows.Forms.BorderStyle.FixedSingle
- .Left = 37
- .Top = 47
- End With
- Me.Controls.Add(pnPhoto)
- End Sub
- End Class
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д