簡體   English   中英

菜單項自定義控件事件

[英]Menu Item Custom Control Events

我正在嘗試創建一個菜單列表項,其中包含一個文本框和一個標簽。 在下面的代碼中,我制作了必要的自定義控件類,該類繼承自ToolStripControlHost,並且在窗體菜單中創建時,其外觀和行為均符合預期。

我遇到的問題是控件的事件未觸發處理程序例程。 在下面的示例中,我希望發生的事情是,當用戶在文本框中鍵入內容時,將會顯示一條消息(其他事件也有同樣的問題)。

謝謝。

控制類別:

Public Class ToolStripTextBoxWithLabel
Inherits ToolStripControlHost



Public Sub New(Optional ByVal lblText As String = "label")
    MyBase.New(New ControlPanel(lblText))

End Sub

Public ReadOnly Property ControlPanelControl() As ControlPanel
    Get
        Return CType(Me.Control, ControlPanel)
    End Get
End Property

End Class


Public Class ControlPanel
Inherits Panel

Friend WithEvents txt As New TextBox
Friend WithEvents lbl As New Label

Public Sub New(ByVal lblText As String)

    Me.Height = 20

    lbl.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Bottom
    lbl.Text = lblText
    lbl.TextAlign = ContentAlignment.BottomLeft
    lbl.AutoSize = True
    lbl.Height = Me.Height
    lbl.Location = New Point(0, 3)
    lbl.Parent = Me

    txt.Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top
    txt.Location = New Point(lbl.Right + 3, 0)
    txt.Width = Me.Width - txt.Left
    txt.Parent = Me


End Sub

End Class

表格實施:

Public Class Form1

Friend tb_SearchBox As ToolStripTextBoxWithLabel



Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    tb_SearchBox = New ToolStripTextBoxWithLabel("Search:") With {.Name = "tb_SearchBox"}
    AddHandler tb_SearchBox.TextChanged, AddressOf tb_SearchBox_TextChanged

    Item1ToolStripMenuItem.DropDownItems.Add(tb_SearchBox)

End Sub

Private Sub tb_SearchBox_TextChanged(sender As Object, e As EventArgs)
    MsgBox("Success")
End Sub

End Class

在這種情況下,不宜使用ToolStripTextBoxWithLabelTextChanged事件,因為該事件僅應在該對象的Text屬性更改時才引發,而在此情況下不會發生。 您需要執行Plutonix建議的操作,但是還應該使用您自己的自定義事件而不是主機的TextChanged事件來執行此操作,例如

Public Event TextBoxTextChanged As EventHandler

Protected Overridable Sub OnTextBoxTextChanged(e As EventArgs)
    RaiseEvent TextBoxTextChanged(Me, e)
End Sub

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    OnTextBoxTextChanged(EventArgs.Empty)
End Sub

我建議不要創建一個用戶控件並在設計器中添加子控件,而不是從Panel派生ControlPanel類並在代碼中創建子控件。 然后,您將在下面的兩個步驟中使用我的答案,即用戶控件將處理TextBoxTextChanged事件,然后引發其自身的事件,而該事件又由ToolStripTextBoxWithLabel處理,這將是其自身的事件。

多虧了jmcilhinney和Plutonix,我才將解決方案組合在一起。 為了完整性和將來的社區參考,完整的解決方案如下。

用戶控制:

Public Class CustomTextBox

Public Event TextBoxTextChanged As EventHandler

Protected Overridable Sub OnTextBoxTextChanged(e As EventArgs)
    RaiseEvent TextBoxTextChanged(Me, e)
End Sub

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    OnTextBoxTextChanged(EventArgs.Empty)
End Sub

Public Sub New (lblText as string)
    InitializeComponent()
    Caption = lblText
End Sub

Public Property Caption() As String
Get
    Return Label1.Text
End Get
Set(ByVal value As String)
    Label1.Text = value
End Set
End Property
Public Overrides Property Text() As String
Get
    Return TextBox1.Text
End Get
Set(ByVal value As String)
    TextBox1.Text = value
End Set
End Property

Public Class

實現方式:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

    Dim SearchBox As New CustomTextBox("Search")
    Dim host As ToolStripControlHost = new ToolStripControlHost(windowNewMenu)
    AddHandler SearchBox.TextBoxTextChanged, AddressOf SearchBox_TextChanged
    ToolStripMenuItem1.DropDownItems.Add(host)

End Sub


Private Sub SearchBox_TextChanged(sender As Object, e As EventArgs)
    MsgBox(sender.Text)
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM