【问题标题】:Menu Item Custom Control Events菜单项自定义控件事件
【发布时间】:2017-03-03 00:03:58
【问题描述】:

我正在尝试创建一个包含文本框和标签作为单个项目的菜单列表项。在下面的代码中,我创建了从 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

【问题讨论】:

  • 您的ControlPanelclass 没有引发任何事件。它需要订阅子控件上的任何事件,然后在控件触发它们时引发自己的事件。这有时被称为“冒泡事件”

标签: vb.net winforms


【解决方案1】:

在这种情况下使用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 处理,这将自己的事件。

【讨论】:

  • 该死,你太快了。刚刚发布了一个类似的答案。 ;)
【解决方案2】:

感谢 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多