vb.net - 如何才能得到一个对象的正确 Handler?
问题描述
我正在制作一个需要动态生成面板的应用程序,而每个面板又会生成两个事件,一个是左键单击,另一个是鼠标右键单击。
右键单击给我带来了麻烦,因为我无法调用我在左键单击时临时放置的处理程序,但是现在我看到它有效,我想将它传递给 ToolStripMenuItem事件,但是当它进入事件时,发送者获得 ToolStripMenuItem 的所有权,在这种情况下,您需要属性“System.Windows.Forms.Panel”才能处理 Panel 对象。
我不确定我是否做对了,你能告诉我怎么做吗?
附上我到目前为止开发的代码
Public Class Form1
Dim pb, pbdoors As New Panel
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim pos As Int32 = 20
Dim contador As Int16 = 1
For i As Int16 = 1 To 3
Dim pb As New Panel With
{
.Width = 120,
.Height = 460,
.Top = 10,
.Left = 10,
.Name = "Panel" & contador,
.Location = New Point(pos, 20)
}
AddHandler pb.Click, AddressOf myClickHandler_b
Me.Panel1.Controls.Add(pb)
pb.BringToFront()
pos = pos + 120
contador = contador + 1
Next
End Sub
End Class
Public Sub myClickHandler_b(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim pos As Integer = Val(TextBox38.Text)
Dim clickedLabel As Panel = DirectCast(sender, Panel)
clickedLabel.Location = New Point((clickedLabel.Location.X + 120), clickedLabel.Location.Y)
TextBox38.Text = pos
End Sub
Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
myClickHandler_b(sender, e)
End Sub
解决方案
Click
Winforms 只为两个鼠标按钮提供一个事件 ( )。您需要检查(并根据该签名强制转换)事件参数以了解何时右键单击:
Public Sub myClickHandler_b(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim mouseevent As MouseEventArgs = TryCast(e, MouseEventArgs)
If mouseevent IsNot Nothing AndAlso mouseevent.Button = MouseButtons.Right Then
RightClick(TryCast(sender, Panel))
Exit Sub
End If
'Left Click
'Ugh. Val() is not your friend.
Dim pos As Integer = Val(TextBox38.Text)
Dim clickedLabel As Control = DirectCast(sender, Control)
clickedLabel.Location = New Point((clickedLabel.Location.X + 120), clickedLabel.Location.Y)
TextBox38.Text = pos
End Sub
Public Sub RightClick(source As Panel)
End Sub
现在是第二部分。在该ToolStripMenuItem1_Click()
方法中,如果您的表单上有多个动态面板,该方法应该如何知道它正在使用哪个面板?您需要此代码中的某些内容知道该信息,并将其用于sender
参数。此外,鉴于左右点击的新处理方式,您还需要仔细考虑这将如何溢出到点击处理程序中。
所以ToolStripMenuItem1_Click()
应该看起来像这样(但可能不完全是!):
Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
myClickHandler_b(pb, Nothing)
End Sub
推荐阅读
- kubernetes - 在一个 pod 中运行同一映像的多个容器与运行多个 pod 与在多个节点上运行
- swift - UIButtonClass addTarget 新视图问题
- javascript - 尝试从 nodejs 中的协同生成器运行器返回
- php - 用于从 Azure 存储 blob 下载文件的简单 PHP cURL 方法
- c++ - LoadImage 没有加载 bmp 文件?
- linux - 如何将 PAM 和 OPA 集成在一起以在 linux 中对 SSH 进行安全控制
- ruby-on-rails - Nokogiri 在将 html 解析c# - Blazor WebAssembly 与 Blazor Server 中的 JsonSerializer.Deserialize 性能
- excel - 从用户窗体上的文本框中更新 Excel 电子表格
- r - 在 R 的 Plantecophys 包中使用 fitacis 绘制多条曲线的问题