我是一名经验丰富的休闲程序员。我很高兴我自己做到了这一点(当然有这个网站和其他人喜欢它)。但现在我需要一些帮助。
我创建了一个用户控件,其中包含多个文本框,蒙版文本框,组合框,复选框和3个按钮。
我创建了一个带有制表符控件(TabControl1)的表单(Form1),它有一个标签页(TabPage1)。我已将我的用户控件添加到TabPage1,控件假定名称为ContactTab1。这是通过VB.net表单设计完成的,而不是通过代码完成的。
当我运行我的表单时,我有代码,所以当我点击我的添加按钮时,它会添加另一个选项卡,其中添加了我的用户控件(无论我在哪个选项卡上)。它工作得很好,我可以添加任意多个选项卡。当我点击我的编辑或删除按钮时,它们工作得很好,因为我知道点击按钮时哪个标签。我的问题是当我单击编辑按钮时,我需要在单击按钮的选项卡上设置ckbDeleteContact.Checked = False
和ckbDeleteContact.Visible = False
。当我点击删除按钮时,我需要在单击按钮的选项卡上设置ckbDeleteContact.Checked = True
和ckbDeleteContact.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
结束班
一旦我理解了这一点,我应该好好去,我应该能够自己完成其余的工作。如果您想知道,我还将使用数据库中的数据填写我的组合框的选项。然后,我将使用该表单获取其中的所有数据,并添加,编辑或删除数据库中的信息。
提前致谢。
答案 0 :(得分:0)
正如@HansPassant所说,您只需要向用户控件添加属性即可访问其中的控件。我不是vb.net的人,但我认为这会对你有所帮助:
Public Function MyTextbox() As System.Windows.Forms.TextBox
Return Textbox1
End Function
您可以在用户控制代码中写下此内容。
答案 1 :(得分:0)
好吧,也许我在帖子中不是最清楚的,或者我只是不理解封装的事情。我可以访问我的所有控件,因为它们是标准控件。我只需要知道如何获取父控件的名称,在这种情况下是用户定义的名为ContactTabX的控件,其中X = 1到 n 控件是在我按下添加按钮时添加的 n 次。我总是可以通过说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
再次感谢您的投入。