2016-12-13 7 views
1

Tabcontrolを使用してtuntimeで作成したすべてのタブページは、 「.count - 1" であることは、それが唯一の2ボタンを表示するようにlimtedされているようなものだが、私は私のプログラム内のすべてのコードをチェックし、何も何もかもを制限されていないボタンがあるすべての私のタブページは、実行時にTabcontrolを使って作成します。私のデータベースにも3番目のボタンを表示できません。

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

、それはです2番目のボタンの後ろにあります。

btn.Location = New Point(0, 10) 
    If TabCategory.TabPages((dt.Rows(i).Item(1)) - 1).Controls.count <> 0 Then 
     btn.Left += 100 
    End If 
:あなたのコードは、最初は、その後Tabpage.controls.count> 0、それは100が追加されますが、だから、最初のボタンの後に、すべてのボタンは、このX = 100

の変更であるとき、X = 0でボタンを配置しますこれに

ので、それは最後のボタンの右側にある+ 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を実行して、最後のコントロールのインデックスを取得できます。そして、最後のコントロールの左値+100を取得しますか? –

+0

はい、まさに正しいです。このコードでは、タブページにこれらのボタンしかないことを前提としています。他のコントロールを使用している場合は、インデックスが異なる場合があります。これを行うもう1つの方法は、変数を使用して最後のbtn.Leftを追跡し、100に変数を追加して、代わりにループするときに次のbtn.Leftを作成することです。 –

+0

ありがとう、あなたはとても親切で、私のために説明しようとしています。実行時にコントロールを配置/配置するという概念をよく理解するのに役立ちました。 TYVM –

関連する問題