Проверка текстового поля при нажатии кнопки ввода

Я создаю надстройку для Autodesk Inventor (программа для трехмерного рисования) и на данный момент играю с позиционными ограничениями.

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

Сначала я использовал событие textbox.textchanged, чтобы изменить значение ограничения. Но это работало не на 100%. Например, при нажатии высоты 1000 высота будет меняться 4 раза (на каждую цифру).

Теперь я перешел к использованию validated event. Это работает лучше, НО я хотел бы, чтобы текстовое поле инициировало проверку при нажатии кнопки Enter. Для этого я на скорую руку это сделал, но это неправильно, я в этом уверен. Как правильно это написать?

Приведенный ниже код работает, но я хотел бы иметь правильный способ добиться результата.

Private Sub tbElevationValue_TextChanged(sender As Object, e As EventArgs) _
    Handles tbElevation.Validated

    ' If the elevation parameter and textbox value are the same
    ' The sub must be aborted
    If CDbl(tbElevation.Text) = oElevationParameter.Value * 10 Then Exit Sub

    ' Check the entered value
    Dim oValue As Double
    If tbElevation.Text = "" Then
        oValue = 0
        tbElevation.Text = 0
    Else
        oValue = tbElevation.Text
    End If

    ' Set the parameter value
    oElevationParameter.Value = oValue / 10

    ' Update the document
    EM_AddIn.StandardAddInServer.m_inventorApplication.ActiveDocument.Update()

End Sub

Private Sub tbOrientation_TextChanged(sender As Object, e As EventArgs) _
    Handles tbOrientation.Validated

    ' If the orientation parameter and textbox value are the same
    ' The sub must be aborted
    If CDbl(tbOrientation.Text) = cRandiansToDegrees(oOrientationParameter.Value) Then Exit Sub

    ' Check the entered value
    Dim oValue As Double
    If tbOrientation.Text = "" Then
        oValue = 0
        tbOrientation.Text = 0
    Else
        oValue = tbOrientation.Text
    End If

    ' Set the parameter value
    oOrientationParameter.Value = cDegreesToRandians(oValue)

    ' Update the document
    EM_AddIn.StandardAddInServer.m_inventorApplication.ActiveDocument.Update()

End Sub

Private Sub OrientationElevationEnterKey_Pressed(sender As Object, e As Windows.Forms.KeyEventArgs) Handles tbElevation.KeyUp, tbOrientation.KeyUp

    If e.KeyCode = Windows.Forms.Keys.Enter Then

        CType(sender, Windows.Forms.TextBox).Parent.Focus()
        CType(sender, Windows.Forms.TextBox).Focus()

    End If


End Sub

person Mech_Engineer    schedule 29.08.2016    source источник


Ответы (1)


Я думаю, ты на правильном пути. Может быть сложно зарегистрировать событие key_down для каждого объекта TextBox, но ваша идея хороша.

Вместо этого вы можете установить прослушиватель событий key_down в свою форму.

Попробуйте что-то вроде этого:

Private Sub Main_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    If e.KeyCode = Keys.KeyCode.Enter Then

        MyBase.Focus() ' this will cause the currently focused control to validate

    End If     
End Sub
person theBugger    schedule 29.08.2016
comment
Не приведет ли это к тому, что при каждом нажатии клавиши, даже если оно не находится в text-boxes, которое я хочу отслеживать для событий, событие запускается? Не будет ли это потреблять больше ресурсов, чем требуется? - person Mech_Engineer; 29.08.2016
comment
Это правда, но вы можете легко добавить тест внутри события KeyDown, чтобы сосредоточить внимание на форме, только если текущий сфокусированный элемент управления является текстовым полем. - person theBugger; 30.08.2016