VB.NET:无法将“System.Windows.Forms.MouseeEventArgs”类型的对象强制转换为“System.Windows.Forms.KeyPressEventArgs”类型

VB.NET:无法将“System.Windows.Forms.MouseeEventArgs”类型的对象强制转换为“System.Windows.Forms.KeyPressEventArgs”类型,vb.net,Vb.net,我正在尝试创建一个有文本框的程序,我需要监视用户输入,只允许字符、空格和控件操作。这是我所有的代码: Private Sub Button1_Click(sender As Object, e As KeyPressEventArgs) Handles Button1.Click TextBox1.ReadOnly = False If TimesPressed = 0 Then Label2.Visible = False

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


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”


我不知道该怎么办,也找不到我在任何地方都能理解的答案。如何解决此问题?

您所单击的按钮1的参数有点不正确

您的e参数应该是EventArgs变量

为了便于复制粘贴,现在它的声明应该是这样的:

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

正如@TechGnome所建议的,您应该尝试双击表单设计器中的按钮以查看自动生成的代码的外观,并从中编辑它。它为你完成了大部分的重担

我不太清楚为什么斯帕瓦科斯删除了他的答案;这是正确的。按钮单击处理程序是事件的后代,该事件将EventArgs类型的对象作为其第二个参数。单击按钮时,将创建一个类型为MouseEventArgs的对象,该对象作为继承层次结构中的子对象从EventArgs派生,因此可以将其传递给单击处理程序,因为子类型始终可以自动转换为其任何父类型

KeyPressEventArgs也是EventArgs的后代,但它是MouseEventArgs的兄弟,而不是继承关系。因此,当您单击按钮并创建MouseeEventArgs时,无法将其传递给声明接受KeyPressEventArgs的子/函数,因为两者之间没有自动转换。鼠标和按键共享同一个父对象,但它们是不同的东西,无法转换

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


另外,在将控件添加到窗体后,请始终重命名控件。对于正在阅读您的代码并试图提供帮助的其他人来说,最糟糕的事情莫过于计算并记住30个按钮X或文本框Y中的哪一个做了什么/是什么-将它们重命名为_inputExtbox或_saveButton大约需要2秒钟,而且对您的帮助也是不可估量的,随着您的程序变得越来越复杂。

请编辑您的帖子,将按钮的代码包括在内,好吗?在这里包含引发错误的行将有助于诊断此错误。请确保在代码或项目选项中对选项进行严格设置。如果没有它,在运行时会出现一些签名不匹配的情况,确实需要使用Option Strict,根据我的经验,您不能通过任何单个选项禁用松弛类型检查。@Spevacus我已经完成了您所做的asked@TechGnome@Spevacus自动生成的事件处理程序创建一个EventArgs类型参数。这是因为单击事件可以由键盘和鼠标以及代码生成,但主题不同。当通过键盘生成时,EventArgs将是EventArgs。为空时,它将设置为MouseeEventArgs并可以强制转换。OP可能手动修改了该代码。我之前的评论是在发布按钮单击事件处理程序之前发布的。我99%确定这段代码不会使用选项Strict On编译。总的来说,这是一个好主意,在处理事件的任何时候,这都是绝对必要的,否则很容易得到一个签名,该签名非常接近,可以编译,但不同程度足以导致运行时难以诊断问题。这是一个很好的建议。你自己也要这样做,看看它不是真正的MouseEventArgs。这就给你留下了解释错误信息的任务,祝你好运;
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click