繁体   English   中英

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

[英]VB.NET: Unable to cast object of type 'System.Windows.Forms.MouseEventArgs' to type 'System.Windows.Forms.KeyPressEventArgs'.'

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


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”类型。

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

我不太确定为什么 Spevacus 删除了他的回答; 这是正确的。 按钮单击处理程序继承自Control.Click事件,它将EventArgs类型的对象作为其第二个参数。 当你点击一个按钮类型的对象MouseEventArgs从创建,而这个下降EventArgs作为继承层次结构中的孩子,所以它可以被传递到单击处理程序(因为小时候类型总是可以被自动转换为的任何一个其父类型)

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

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

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

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

您对Button1_Clicked的参数稍有不正确。

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

为了方便复制粘贴,下面是它的声明现在的样子:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM