【问题标题】:dynamically create a new tab with textbox, button in the tab with click and keypress events (AddHandler is what i cant get to work)使用文本框动态创建一个新选项卡,选项卡中的按钮带有单击和按键事件(AddHandler 是我无法工作的)
【发布时间】:2015-04-09 23:29:18
【问题描述】:

我正在创建一些选项卡,我需要做两件我无法开始工作的事情。我需要AddHandler 来获得Textbox.Keypress 事件和Button.Click 事件。我可以让这些东西在 tabcontrol 之外工作,但不能在里面。

在下面的示例中,我的文本框和按钮从一个选项卡到另一个具有相同的名称,我认为这可能是我的问题,但即使在选项卡之间更改名称也不起作用。我认为我需要在 AddHandler 部分中更具体地提供选项卡名称和控制权。我的真实代码中有一个逻辑允许我为每个选项卡面板和控件提供唯一的名称,但我无法让简单的部分工作。

我留下了一些我尝试过的评论,但我尝试了很多其他的东西。

Public Class Form1
  Public Sub addTab(tabPageName As String)

    Dim tabpage As New TabPage
    tabpage.Text = tabPageName
    tabpage.Name = "tabPage1" 'real code has logic to make sure names are unique
    Dim label1 As New Label
    Dim txtCreator As New TextBox
    Dim combox1 As New ComboBox
    Dim tabPageButton2 As New Button

    tabPageButton2.Parent = tabpage
    label1.Parent = tabpage
    txtCreator.Parent = tabpage
    combox1.Parent = tabpage

    label1.Location = New Point(10, 10)
    txtCreator.Location = New Point(150, 10)
    combox1.Location = New Point(300, 10)
    tabPageButton2.Location = New Point(20, 40)

    label1.Text = "Creator"
    txtCreator.Name = "txtCreator"

    'fill the comboboxes...this will come from a database but testing now.
    combox1.Items.Add("one")
    combox1.Items.Add("two")
    combox1.Items.Add("three") 'ok that works so should work from DB no problem.

    tabRoleClass.TabPages.Add(tabpage)

  End Sub

  Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    addTab("First Tab")
    AddHandler Controls("tabRoleClass.tabPage1.tabPageButton2").Click, AddressOf tabPageButton_click
    'AddHandler CType(Controls("tabPageButton"), Button).Click, AddressOf tabPageButton_click
    'AddHandler Controls("tabPageButton").Click, AddressOf tabPageButton_click
    AddHandler CType(Controls("txtCreator"), TextBox).KeyPress, AddressOf txtcreator_keypress 'the Keypress to call lookup
  End Sub
  Private Sub tabPageButton_click(sender As System.Object, e As System.EventArgs) 'Handles tabPageButton.click
    MessageBox.Show(tabRoleClass.SelectedTab.Name.ToString)
  End Sub

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    addTab("Second Tab")
    tabRoleClass.SelectedIndex = tabRoleClass.TabCount - 1
    'AddHandler Controls("tabRoleClass.tabPage1.tabPageButton2").Click, AddressOf tabPageButton_click
    'AddHandler CType(Controls("tabPageButton"), Button).Click, AddressOf tabPageButton_click
    'AddHandler Controls("tabPageButton").Click, AddressOf tabPageButton_click
    'AddHandler CType(Controls("txtCreator"), TextBox).KeyPress, AddressOf txtcreator_keypress 'the Keypress to call lookup
  End Sub
  Private Sub txtcreator_keypress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) 'Handles txtCreator.KeyPress
    MessageBox.Show("keypress worked on " & tabRoleClass.SelectedTab.Name.ToString)
  End Sub
End Class

【问题讨论】:

  • 在创建控件时添加处理程序 (addTab)
  • 看起来你会受益于一个继承自标签页并拥有你需要的控件和处理程序的类。使用带有名称的构造函数,您可以轻松实现串行命名。

标签: vb.net addhandler


【解决方案1】:

这是一个非常令人困惑的问题,您的代码确实可以进行一些清理,但是您需要将 AddHandler 代码添加到 @Plutonix 指出的 addTab 子例程中:

Public Sub addTab(tabPageName As String)
   Dim tabpage As New TabPage
   Dim tabPageButton As New Button
   Dim txtCreator As New TextBox

   /.../

   AddHandler tabPageButton.Click, AddressOf tabPageButton_click
   AddHandler txtCreator.KeyDown, AddressOf txtcreator_keypress

   tabRoleClass.TabPages.Add(tabpage)
End Sub

Private Sub tabPageButton_click()
   MessageBox.Show(tabRoleClass.SelectedTab.Name.ToString)
End Sub

Private Sub txtcreator_keypress()
   MessageBox.Show("keypress worked on " & tabRoleClass.SelectedTab.Name.ToString)
End Sub


Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
   addTab("First Tab")        
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
   addTab("Second Tab")
   tabRoleClass.SelectedIndex = tabRoleClass.TabCount - 1
End Sub

AddHandler 通过向控件添加事件处理程序来工作。 这意味着每次在此运行时引发事件时,新的事件处理程序都会处理该事件;每次您单击您的tabPageButton 时,关联的事件tabPageButton_click 都会处理它。

因此,您只需添加一次处理程序,最好在创建控件时添加。例如,绝对不需要在每次按键时都创建它们。你应该查一下event handlers on MSDN

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    抱歉,如果代码令人困惑,我将我的实际代码剪切成一个“示例”,我可以看到混乱。现在我当然很困惑,我最初有 AddHandler INSIDE the addTab sub 创建选项卡,但它在那里不起作用,我错误地认为原因是控件尚未创建,所以我将其移出。今天早上把它移回这个潜艇工作得很好,我不知道我做错了什么,但是通过把它移到它所属的地方它工作得很好,非常感谢,我在这方面工作了 2 天,尝试和谷歌搜索。下次我将发布真实代码而不是示例,以减少混淆并删除我的评论尝试(我认为这些将有助于展示我正在尝试的内容,但我认为它没有)

    【讨论】:

    • 很高兴您尝试展示您之前尝试过的内容,因此请继续这样做,但请尽量提供尽可能多的信息,同时保持帖子的长度。下次见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2014-01-26
    • 2017-09-06
    • 2017-01-08
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多