2013-08-04 91 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 

再次感谢您的意见。