Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.3k views
in Technique[技术] by (71.8m points)

powershell - Limiting text box entry to numbers or numpad only - no special characters

I have a small program which accepts an integer and converts it to DateTime. However, I try to use KeyCode to only allow numbers from both keyboard and numpad, and eliminate the special characters and letters. My code is allowing Shift+Num to enter those special characters. How do eliminate them from being entered?

$FromDateText.Add_KeyDown({KeyDown})
$ToDateText.Add_KeyDown({KeyDown})  #TextBox

Function KeyDown()
{
    if ($FromDateText.Focused -eq $true -or $ToDateText.Focused -eq $true)
    {
        if ($_.KeyCode -gt 47 -And $_.KeyCode -lt 58 -or $_.KeyCode -gt 95 -and
            $_.KeyCode -lt 106 -or $_.KeyCode -eq 8)
        {
            $_.SuppressKeyPress = $false 
        }
        else
        {
            $_.SuppressKeyPress = $true  
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Instead of intercepting the KeyDown event, I'd simply just remove any non-digit character from the TextBox every time the TextChanged event is raised:

$ToDateText.add_TextChanged({
    # Check if Text contains any non-Digits
    if($tbox.Text -match 'D'){
        # If so, remove them
        $tbox.Text = $tbox.Text -replace 'D'
        # If Text still has a value, move the cursor to the end of the number
        if($tbox.Text.Length -gt 0){
            $tbox.Focus()
            $tbox.SelectionStart = $tbox.Text.Length
        }
    }
})

Way easier than trying to infer the input value from Key event args


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...