VB. NET: невозможно привести объект типа 'System. Windows .Forms.MouseEventArgs' к типу 'System. Windows .Forms.KeyPressEventArgs'. ' - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь создать программу с текстовым полем, и мне нужно контролировать ввод пользователя, чтобы разрешить только символы, пробелы и операции управления. Это весь код, который у меня есть:


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'.

Я не знаю, что делать делай, и я не могу найти ответы, которые я понимаю где угодно. Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 11 января 2020

Я не совсем уверен, почему Спевак удалил свой ответ; это было правильно. Обработчик нажатия кнопки происходит от события Control.Click , которое принимает объект типа EventArgs в качестве второго параметра. Когда вы нажимаете кнопку, создается объект типа MouseEventArgs, который наследуется от EventArgs как дочерний элемент в иерархии наследования, поэтому его можно передать обработчику щелчков (поскольку дочерний тип всегда может автоматически приводиться к любому из его родительские типы)

KeyPressEventArgs также происходит от EventArgs, но является родственным элементом MouseEventArgs, а не унаследованным отношением. Таким образом, когда вы нажимаете кнопку и создается MouseEventArgs, ее нельзя передать в Sub / Function, которая объявлена ​​для получения KeyPressEventArgs, потому что между ними нет автоматического преобразования c. Мышь и KeyPress имеют одного и того же родителя, но разные вещи и не могут быть преобразованы.

Короче говоря, измените свой обработчик нажатий кнопок, чтобы он использовал EventArgs вместо KeyPressEventArgs

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

В сторону, пожалуйста, всегда переименовывайте свои элементы управления после добавления их в форма. Есть несколько вещей, которые хуже для кого-то, кто читает ваш код и пытается помочь, чем работать и помнить, какая из 30 кнопок X или текстового поля Y делает что / есть что - переименование их в «_inputTextBox» или «_saveButton» занимает около 2 секунд и неизмеримо помогает вам, так как ваша программа усложняется

0 голосов
/ 10 января 2020

Аргументы, которые вы используете для Button1_Clicked, немного неверны.

Ваш аргумент e должен быть переменной EventArgs.

Для простого копирования вставьте, вот как его объявление должно посмотрите сейчас:

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

Как подсказывает @TechGnome, попробуйте дважды щелкнуть кнопку в конструкторе форм, чтобы увидеть, как выглядит автоматически сгенерированный код, и отредактировать его оттуда. Это делает большую часть тяжелой работы для вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...