0

いくつかのタブを作成していますが、動作させるには 2 つのことが必要ですが、動作しません。私はイベントとイベントAddHandlerのために必要です。これらをタブコントロールの外部で機能させることはできますが、内部ではできません。 Textbox.KeypressButton.Click

以下の例では、テキスト ボックスとボタンの名前がタブ間で同じになっています。これは私の問題かもしれないと思いましたが、タブ間で名前を変更しても機能しません。タブ名とコントロールを指定するには、 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
4

2 に答える 2

0

コードがわかりにくかった場合は申し訳ありませんが、実際のコードを切り取って「サンプル」を作成すると、混乱が見られます。もちろん、私は混乱しています。元々、タブを作成する addTab サブサブ内に AddHandler がありましたが、そこでは機能しませんでした。その理由は、コントロールがまだ作成されていないためであると誤って想定したため、移動しました。今朝、このサブに戻すと完全に機能しました。何が間違っていたのかわかりませんが、所属する場所に移動することでうまく機能しています。ありがとうございました。2日間、グーグルで試してみました. 次回は、サンプルの代わりに実際のコードを投稿して、混乱を減らし、コメントされた試みを削除します(それらは私が何をしようとしていたかを示すのに役立つと思いましたが、そうではなかったと思います)

于 2015-04-10T14:50:53.403 に答える
0

これは非常に紛らわしい質問であり、コードは実際にいくつかのクリーニングを行うことができますが、@Plutonix で指摘されているようAddHandlerにサブルーチンにコードを追加する必要があります。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がそれを処理します。

したがって、できればコントロールの作成時にハンドラーを 1 回追加するだけで済みます。たとえば、キーを押すたびにそれらを作成する必要はまったくありません。MSDN でイベント ハンドラーを調べる必要があります。

お役に立てれば!

于 2015-04-10T08:58:11.187 に答える