【问题标题】:VB.NET: Unable to cast object of type 'System.Windows.Forms.MouseEventArgs' to type 'System.Windows.Forms.KeyPressEventArgs'.'VB.NET:无法将“System.Windows.Forms.MouseEventArgs”类型的对象转换为“System.Windows.Forms.KeyPressEventArgs”。
【发布时间】:2020-01-10 13:41:28
【问题描述】:

我正在尝试创建一个具有文本框的程序,并且我需要监视用户输入以仅允许字符、空格和控制操作。这是我所有的代码:


Private Sub Button1_Click(sender As Object, e As KeyPressEventArgs) Handles Button1.Click
        TextBox1.ReadOnly = False
        If TimesPressed = 0 Then
            Label2.Visible = False
            TextBox1.Text = “Welcome to VB.Net, ” & TextBox1.Text
            Button1.Text = "Repeat" 
            TextBox1.ReadOnly = True 
            TextBox1.BackColor = SystemColors.Window 
            TimesPressed = 1
        ElseIf TimesPressed = 1 Then
            Label2.Visible = True
            TextBox1.Clear() 
            Button1.Text = "Run" 
            TimesPressed = 0
        Else
            TimesPressed = 0
        End If
End Sub

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    If Char.IsLetter(e.KeyChar) = False And Char.IsWhiteSpace(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
        e.Handled = True
    End If
End Sub

然后我有一个提交输入的按钮,但是当我尝试点击它时,我会看到一个错误框,上面写着:

无法将“System.Windows.Forms.MouseEventArgs”类型的对象转换为“System.Windows.Forms.KeyPressEventArgs”类型。

我不知道该怎么做,也无法在任何地方找到我理解的答案。我该如何解决这个问题?

【问题讨论】:

  • 能否编辑您的帖子以包含您的button 的代码?包括在此处引发错误的行将有助于诊断。
  • 确保您有Option Strict On,无论是在代码中还是在项目选项中。没有它,在运行时会出现一些签名不匹配的问题(确实需要使用Option Strict 来完成,根据我的经验,您不能通过任何单个选项禁用宽松的类型检查)。
  • @Spevacus 我已经完成了你的要求
  • @TechGnome @Spevacus 自动生成的事件处理程序创建一个 EventArgs 类型参数。这是因为Click 事件可以由键盘和鼠标生成(尽管通过代码,不同的主题)。当由键盘生成时,EventArgs 将是EventArgs.Empty,当generated by a Mouse click 时,它将设置为MouseEventArgs(并且可以强制转换)。 OP 可能手动修改了该代码。
  • 我之前的评论是在按钮单击事件处理程序发布之前发布的。我 99% 确定这段代码不会用 Option Strict On 编译。总的来说,这是一个好主意,并且在您处理事件时绝对必要(否则很容易获得一个足够接近编译但又足够不同以在运行时导致难以诊断的问题的签名)。

标签: vb.net


【解决方案1】:

我不太确定为什么 Spevacus 删除了他的答案;这是正确的。按钮单击处理程序源自Control.Click 事件,它将EventArgs 类型的对象作为其第二个参数。当您单击按钮时,会创建一个 MouseEventArgs 类型的对象,并且 this 从 EventArgs 继承 作为继承层次结构中的子级,因此它可以传递给单击处理程序(因为子级type 总是可以自动转换为它的任何一种父类型)

KeyPressEventArgs 也是EventArgs 的后代,但它是MouseEventArgs 的兄弟,而不是继承关系。因此,当您单击按钮并创建 MouseEventArgs 时,它不能传递给声明为采用 KeyPressEventArgs 的子/函数,因为两者之间没有自动转换。 MouseKeyPress 共享同一个父级,但是不同的东西,不能转换。

长话短说,更改您的按钮点击处理程序,使其采用 EventArgs 而不是 KeyPressEventArgs

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

顺便说一句,请务必在将控件添加到表单后重命名它们。对于正在阅读您的代码并试图提供帮助的其他人来说,没有什么比必须解决并记住 30 个按钮 X 或文本框 Y 中的哪一个做了什么/是什么更糟糕的事情了 - 将它们重命名为“_inputTextBox”或“_saveButton”需要大约 2 秒,并且随着您的程序变得越来越复杂,也可以极大地帮助您。

【讨论】:

    【解决方案2】:

    您对Button1_Clicked 的论点有些不正确。

    您的 e 参数应该是一个 EventArgs 变量。

    为了方便复制粘贴,它的声明现在应该如下所示:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    

    正如@TechGnome 建议的那样,您应该尝试双击表单设计器中的按钮以查看自动生成的代码的外观并从那里进行编辑。它为您完成了大部分繁重的工作!

    【讨论】:

    • 这是个好建议。自己也这样做,看看它实际上不是 MouseEventArgs。这确实让你有解释错误消息的任务,祝你好运;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多