这里有新海报和各种 VB hack。
我有一个包含一个图片框和三个文本框的 Windows 窗体。三个文本框(红色、绿色、蓝色)用于输入 000 到 255 之间的数值,表示颜色代码。PictureBox 将显示来自三个 TextBox 值的结果颜色。
我的验证例程 ValidDecCode 确保输入的值在允许的范围内 (000-255)。
如果用户在第一个位置输入“2”,则一切正常。如果用户随后在第二个位置输入“6”,它将无法通过我的验证测试。
输入 KeyDown 事件后,我保存 sender.selectionstart 和 sender.text 值。输入“6”后,selectionstart 将为 1,文本包含已验证的数据“2”。
一旦“6”未通过验证测试,我将显示一个 MessageBox,重新加载我保存的发件人数据、文本和 selectionstart。这会将表单返回到输入“6”之前的状态。文本框将显示一个“2”,光标位于“2”之后。
我觉得奇怪的是,如果我注释掉 MessageBox.Show() 行,TextBox 将在验证失败后显示“26”。如果我注释掉重新加载我的发件人数据而不是 MessageBox.Show() 行,则 TextBox 将显示“26”。
我想知道为什么注释掉 MessageBox.Show() 行不会在输入无效数据之前将表单返回到其状态,我该怎么办。调用 MessageBox 使其工作有什么意义?
Private Sub RedBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles RedBox.KeyDown, GreenBox.KeyDown, BlueBox.KeyDown
Dim InChr As String
Dim InPos As Integer = sender.selectionstart
Dim InText As String = sender.text
If IsNumeric(Chr(e.KeyCode)) Then
InChr = Chr(e.KeyValue)
If Not ValidDecCode(InText + InChr, InPos) Then
MessageBox.Show("Invalid value")
sender.text = InText
sender.selectionstart = InPos
End If
Else
MessageBox.Show("Invalid value")
sender.Text = InText
sender.selectionstart = InPos
Exit Sub
End If
End Sub