2016-12-13 17 views
1

Почему вся моя закладка, созданная во время tuntime с помощью Tabcontrol, не может показать мою третью кнопку, даже если она есть в моей базе данных? Это как это время Limted, чтобы показать только 2 кнопки, но я проверил каждый код в моей программе, ничто не ограничивает Everythings является».count - 1"Все мои закладки создаются во время выполнения, используя Tabcontrol не может показать третью кнопку, даже если у меня она есть в моей базе данных

Imports System.Data.OleDb 

Public Class Services 

Dim con = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = Cypher.mdb;" 
Dim cnnOledb As New OleDbConnection 
Dim cmdload As New OleDbCommand 
Dim cmdInsert As New OleDbCommand 
Public categoryName As String 

Private Sub Services_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    Me.CenterToScreen() 
    cnnOledb.ConnectionString = con 
    cnnOledb.Open() 
    cmdload.CommandText = "Select * From [Services]" 
    cmdload.Connection = cnnOledb 
    Max() 
    Tab() 
    add_btn() 

End Sub 

Private Sub Max() 
    Dim cmdMax As New OleDbCommand 
    cmdMax.CommandText = "Select MAX(id) from Services" 
    cmdMax.Connection = cnnOledb 
    Try 
     Dim dr As OleDbDataReader = cmdMax.ExecuteReader() 
     If dr.Read = True Then 
      If dr(0).ToString = "" Then 
       txtID.Text = "1" 
      Else 
       txtID.Text = dr(0) + 1.ToString 
      End If 
     End If 
    Catch 
     MsgBox("Error !") 
    End Try 

End Sub 


Private Sub Tab() 
    cobCategory.Items.Clear() 
    TabCategory.TabPages.Clear() 

    Dim cmdCategory As New OleDbCommand 
    cmdCategory.CommandText = "Select * from Category" 
    cmdCategory.Connection = cnnOledb 

    Dim dt As New DataTable 
    dt.Load(cmdCategory.ExecuteReader) 
    For i As Integer = 0 To dt.Rows.Count - 1 
     Dim tab As New TabPage() 
     tab.Name = "tab" + dt.Rows(i).Item(1).ToString 
     tab.Text = tab.Name.Remove(0, 3) 
     cobCategory.Items.Add(dt.Rows(i).Item(1).ToString) 
     TabCategory.TabPages.Add(tab) 
    Next 

    TabCategory.TabPages.Add("+") 
End Sub 

Private Sub add_btn() 
    Dim dt As New DataTable 
    dt.Load(cmdload.ExecuteReader) 

    Dim myFont As System.Drawing.Font 

    myFont = New System.Drawing.Font("Century Gothic", 12) 

    For i As Integer = 0 To dt.Rows.Count - 1 

     Dim btn As New Button() 
     btn.Name = "btn" + dt.Rows(i).Item(2).ToString 
     btn.Text = btn.Name.Remove(0, 3) 
     btn.Height = 30 
     btn.Width = 90 
     btn.Location = New Point(0, 10) 
     If TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls.count <> 0 Then 
      btn.Left += 100 
     End If 
     btn.Font = myFont 

     TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls.Add(btn) 
    Next 

End Sub 

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 
    Try 
     cmdInsert.CommandText = "Insert into [Services] values(" & txtID.Text & ", " & cobCategory.SelectedIndex + 1 & ", '" & txtServices.Text & "', " & txtDur.Text & ", " & txtPrices.Text & ");" 
     cmdInsert.CommandType = CommandType.Text 
     cmdInsert.Connection = cnnOledb 
     cmdInsert.ExecuteNonQuery() 
    Catch ex As Exception 
     MsgBox("Fail to insert data") 
    End Try 
End Sub 

Private Sub TabCategory_Click(sender As Object, e As EventArgs) Handles TabCategory.Click 
    If TabCategory.SelectedTab Is TabCategory.TabPages(TabCategory.TabPages.Count - 1) Then 
     New_Category.ShowDialog() 
    End If 
End Sub 

Public Sub New_Cate() 
    Dim cmdMax As New OleDbCommand 
    cmdMax.CommandText = "Select MAX(ID) from Category" 
    cmdMax.Connection = cnnOledb 
    Dim ID As Integer 
    Try 
     Dim dr As OleDbDataReader = cmdMax.ExecuteReader() 
     If dr.Read = True Then 
      If dr(0).ToString = "" Then 
       ID = 1 
      Else 
       ID = dr(0) + 1 
      End If 
     End If 
    Catch 
     MsgBox("Error !") 
    End Try 

    Dim cmdAddCategory As New OleDbCommand 
    Try 
     cmdAddCategory.CommandText = "Insert into [Category] values(" & ID & ", '" & categoryName & "');" 
     cmdAddCategory.CommandType = CommandType.Text 
     cmdAddCategory.Connection = cnnOledb 
     cmdAddCategory.ExecuteNonQuery() 
    Catch ex As Exception 
     MsgBox("Fail to insert new category") 
    End Try 

    Tab() 
End Sub 
End Class 

The picture show that even my database have 3 item which should be appear as buttons inside the 1st tabpage, but in the runtime it didn't, instead it just show the first 2 item.

ответ

2

кнопка есть, это за второй кнопкой. Ваш код изначально помещает кнопку в точке х = 0, то при Tabpage.controls.count> 0, это добавляет 100. Так каждая кнопка после первой кнопки находится в точке х = 100.

Изменить это:

btn.Location = New Point(0, 10) 
    If TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls.count <> 0 Then 
     btn.Left += 100 
    End If 

к этому так это + 100 справа от последней кнопки:

btn.Location = New Point(0, 10) 
    If TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls.count <> 0 Then 
     btn.Left += TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls(TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls.Count - 1).Left + 100 
    End If 
+0

Спасибо чувак !! Спасибо, что потратили время, просматривая мою программу, помогите мне найти проблему :) Но у меня есть некоторое затруднительное понимание вашего кода, пожалуйста, исправьте меня, если я ошибаюсь, потому что я хочу понять ваш код. Значит, каждый элемент управления в TabPages имеет собственный индекс? И первые созданные элементы управления во время выполнения будут иметь индекс 0? Таким образом, вы можете получить индекс последнего элемента управления, выполнив Controls.Count - 1? А затем получите последнее значение управления .Left + 100? –

+0

Да, точно. Имейте в виду, что этот код предполагает, что у вас есть только эти кнопки на вкладке ... если у вас есть другие элементы управления, индексы могут быть разными. Другой способ сделать это - использовать переменную для отслеживания последнего btn.Left и добавить 100 к переменной, а затем сделать следующий btn.Left, когда вы зацикливаете. –

+0

Спасибо, много чувак, ты очень добрый и желающий объяснить мне. Это очень помогло мне понять концепцию размещения/размещения элементов управления во время выполнения. TYVM –