1

这里有新海报和各种 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
4

0 回答 0