2013-08-04 130 views
0

我是一個休閒程序員,沒有太多的經驗。我很高興我自己做到了這一點(當然有來自這個網站和其他人的幫助)。但現在我需要一些幫助。訪問控件位於動態創建的用戶控件vb.net

我用幾個文本框,蒙面文本框,組合框,複選框和3個按鈕創建了一個用戶控件。

我已經創建了一個窗體(Form)與具有(TabPage1)就可以了1標籤頁的選項卡控件(TabControl1)。我已將我的用戶控件添加到TabPage1,並且控件採用名稱ContactTab1。這是通過VB.net表單設計完成的,而不是通過代碼完成的。

當我跑我的形式我有代碼,這樣,當我點擊我的添加按鈕,它增加了添加到它(無論我可以是在其標籤)與我的用戶控制的另一個選項卡。它工作的很好,我可以添加儘可能多的選項卡。當我點擊我的編輯或刪除按鈕時,他們工作得很好,因爲我知道按鈕被點擊時哪個選項卡處於打開狀態。我的問題是,當我點擊編輯按鈕時,我需要在單擊該按鈕的選項卡上設置ckbDeleteContact.Checked = FalseckbDeleteContact.Visible = False。當我點擊刪除按鈕時,我需要在單擊該按鈕的選項卡上設置ckbDeleteContact.Checked = TrueckbDeleteContact.Visible = True。我可以訪問第一個選項卡上的複選框,但語句ContactTab1.ckbDeleteContact.Checked = False沒有問題。

所以我的問題是,我該如何訪問所有這些文本框,掩碼文本框,組合框,並在這些動態添加控件我的複選框?下面是我爲Form1的代碼和我都談到了我所需要的工作:

Public Class Form1 
Private intTabPage As Integer = 1 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    TabPage1.Text = "Contact #" & intTabPage 
    ContactTab1.ckbDeleteContact.Checked = False 
    ContactTab1.ckbDeleteContact.Visible = False 
    TabPage1.Name = "TabPage" & intTabPage 
    intTabPage = intTabPage + 1 
End Sub 

Private Sub UC_btnAddContact_Click() Handles ContactTab1.UC_btnAddContact_Click 
    AddNewTab() 
End Sub 

Private Sub UC_btnEditContact_Click() Handles ContactTab1.UC_btnEditContact_Click 
    '**DEBUG: See which tab the button is on when clicked 
    MessageBox.Show("The edit button from the following tab was clicked: " & TabControl1.SelectedTab.Name() & vbCrLf & "The edit button on the following contact tab was clicked: " & TabControl1.SelectedTab.Controls.Item(0).Name(), "Check", MessageBoxButtons.OK, MessageBoxIcon.Information) 

    'This code is what needs to work. ContactTabObject would have naming convention "ContactTabX" where X = the tab # 1 through the highest tab # 
    'ContactTabObject.ckbDeleteContact.Checked = False 
    'ContactTabObject.ckbDeleteContact.Visible = False 
End Sub 

Private Sub UC_btnDeleteContact_Click() Handles ContactTab1.UC_btnDeleteContact_Click 
    '**DEBUG: See which tab the button is on when clicked 
    MessageBox.Show("The delete button from the following tab was clicked: " & TabControl1.SelectedTab.Name() & vbCrLf & "The delete button on the following contact tab was clicked: " & TabControl1.SelectedTab.Controls.Item(0).Name(), "Check", MessageBoxButtons.OK, MessageBoxIcon.Information) 

    'This code is what needs to work. ContactTabObject would have naming convention "ContactTabX" where X = the tab # 1 through the highest tab # 
    'ContactTabObject.ckbDeleteContact.Visible = True 
    'ContactTabObject.ckbDeleteContact.Checked = True 
End Sub 

Function AddNewTab() 
    Dim NewTab As New TabPage 
    Dim NewContactTab As New ContactTab 

    TabControl1.Controls.Add(NewTab) 
    TabControl1.SelectTab(NewTab) 
    NewTab.Text = "Contact #" & intTabPage 
    NewTab.BackColor = System.Drawing.Color.Transparent 
    NewTab.Controls.Add(NewContactTab) 
    NewTab.Name = "TabPage" & intTabPage 

    NewContactTab.Location = New System.Drawing.Point(6, 6) 
    NewContactTab.BackColor = System.Drawing.Color.Transparent 
    NewContactTab.ckbDeleteContact.Checked = False 
    NewContactTab.ckbDeleteContact.Visible = False 
    AddHandler (NewContactTab.btnAddContact.Click), AddressOf UC_btnAddContact_Click 
    AddHandler (NewContactTab.btnEditContact.Click), AddressOf UC_btnEditContact_Click 
    AddHandler (NewContactTab.btnDeleteContact.Click), AddressOf UC_btnDeleteContact_Click 
    NewContactTab.Name = "ContactTab" & intTabPage 

    intTabPage = intTabPage + 1 
End Function 

末級

一旦我得到這個想通了,我應該去的好,我應該能夠得到自行休息。如果你想知道,我也會用數據庫中的數據填充我的組合框的選項。然後,我將使用表單來獲取其中的所有數據,並添加,編輯或刪除數據庫中的信息。

在此先感謝。

+1

當您將控件放在UserControl * private *中時,將很容易將這些鴨子保持連續。封裝很重要。添加您自己的公共屬性和事件。 –

+0

感謝漢斯,但就像我說的,我不是很有經驗。不完全確定如何做到這一點。但是難道你不知道嗎,我在發佈之後就明白了。也許我可以封裝更好,因爲我繼續前進...大聲笑 – Jeremy

+0

我會告訴你我用過的所有答案。顯然不能做7個小時;) – Jeremy

回答

0

由於@HansPassant說你只需要添加屬性到你的用戶控件來訪問你的控件就可以了。我不是一個vb.net的傢伙,但我認爲這會幫助你:

Public Function MyTextbox() As System.Windows.Forms.TextBox 
    Return Textbox1 
End Function 

你可以在你的用戶控件代碼寫這個。

0

好的,也許我在我的文章中不是最清楚的,或者我只是不理解封裝的東西。我可以訪問我的所有控件,因爲它們是標準控件。我只需要知道我怎麼能得到父母的控制,在這種情況下,一個名爲ContactTabX用戶定義的控件的名稱,其中X = 1〜當我按我的添加按鈕ň倍,添加ñ控制。我總是可以通過諸如ContactTab5.ckbDeleteContact.Visible = True之類的東西來訪問它們。我不想硬編碼,因爲我不知道添加了多少個選項卡,所以我想要一種方法來知道按下按鈕時我在哪個選項卡上,這樣我就可以更改該特定選項卡上的複選框屬性(因爲每個標籤是相同的)。

我花了幾個小時試圖找到答案了出來,並且這裏是我能張貼的問題(去圖)後,找出大約10分鐘。我希望這可以幫助其他人。對於您的專家,我的解決方案中有任何反饋意見。我總是喜歡學習:)

因此,取代我最初發布的這些潛艇用這些工作完美。

Private Sub UC_btnEditContact_Click() Handles ContactTab1.UC_btnEditContact_Click 
    '**DEBUG: See which tab the button is on when clicked 
    'MessageBox.Show("The edit button from the following tab was clicked: " & TabControl1.SelectedTab.Name() & vbCrLf & "The edit button on the following contact tab was clicked: " & TabControl1.SelectedTab.Controls.Item(0).Name(), "Check", MessageBoxButtons.OK, MessageBoxIcon.Information) 

    Dim Contact As ContactTab = TabControl1.SelectedTab.Controls.Item(0) 
    Contact.Name = TabControl1.SelectedTab.Controls.Item(0).Name() 
    Contact.ckbDeleteContact.Visible = False 
    Contact.ckbDeleteContact.Checked = False 
    Contact = Nothing 
End Sub 

Private Sub UC_btnDeleteContact_Click() Handles ContactTab1.UC_btnDeleteContact_Click 
    '**DEBUG: See which tab the button is on when clicked 
    ' MessageBox.Show("The delete button from the following tab was clicked: " & TabControl1.SelectedTab.Name() & vbCrLf & "The delete button on the following contact tab was clicked: " & TabControl1.SelectedTab.Controls.Item(0).Name(), "Check", MessageBoxButtons.OK, MessageBoxIcon.Information) 

    Dim Contact As ContactTab = TabControl1.SelectedTab.Controls.Item(0) 
    Contact.Name = TabControl1.SelectedTab.Controls.Item(0).Name() 
    Contact.ckbDeleteContact.Visible = True 
    Contact.ckbDeleteContact.Checked = True 
    Contact = Nothing 
End Sub 

再次感謝您的意見。