您可能已经注意到,在 NumericUpDown 控件中键入数字时有些古怪。为了解决此问题,您需要添加 Enter 事件处理程序。
查看 NumericUpDown 控件行为
运行程序并开始游戏。sum NumericUpDown 控件中的 0(零)旁边应有一个闪烁的光标。
键入 3,将出现 30。键入 5,将出现 350,但在一秒钟之后它将更改为 100。
在解决此问题之前,请先想想发生了什么事。想一想为什么在键入 3 之后 0 没有消失。再想一想为什么 350 更改为 100,以及在改变之前为什么会有延迟。
说明
尽管这种行为看起来古怪,但是可以解释得通。当单击“开始”按钮时,此按钮的“Enabled”属性将设置为“False”,并且此按钮显示为灰色且不可用。程序将查找下一个 TabIndex 值最小的控件(即 sum NumericUpDown 控件),并将焦点更改到此控件。当使用 Tab 键转到 NumericUpDown 控件时,系统会自动将光标定位到此控件的起始位置,这就是导致您键入的数字从左侧输入而非右侧输入的原因。当输入一个超过“MaximumValue”属性的数字时(此属性设置为 100),将用最大值替换输入的数字。
为 NumericUpDown 控件添加 Enter 事件处理程序
为了防止出现这种古怪的行为并使程序更易于使用,请为每个 NumericUpDown 控件的 Enter 事件添加事件处理程序。使用**“属性”对话框中的“事件”页,为称作“answer_Enter”**的 sum NumericUpDown 控件添加 Enter 事件处理程序。
“属性”对话框
代码应如下所示。
Private Sub answer_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sum.Enter ' Select the whole answer in the NumericUpDown control. Dim answerBox = TryCast(sender, NumericUpDown) If answerBox IsNot Nothing Then Dim lengthOfAnswer = answerBox.Value.ToString().Length answerBox.Select(0, lengthOfAnswer) End If End Sub
private void answer_Enter(object sender, EventArgs e) { // Select the whole answer in the NumericUpDown control. NumericUpDown answerBox = sender as NumericUpDown; if (answerBox != null) { int lengthOfAnswer = answerBox.Value.ToString().Length; answerBox.Select(0, lengthOfAnswer); } }
尽管代码最初看起来很复杂,但如果您一步一步来,这些代码就会更加容易理解。首先,查看方法的顶部:在 C# 中为 object sender,在 Visual Basic 中为 sender As System.Object。这意味着,每当您使用 sender 时,此方法内部都会引用其 Enter 事件已激发的 NumericUpDown 控件。因此,在此方法的第一行中,您需要指定它不只是一个对象,而应具体地指明它是一个 NumericUpDown 控件。(每个 NumericUpDown 控件都是一个对象,但并不是每个对象都是 NumericUpDown 控件。)下一行验证 answerBox 是否已成功地从一个对象转换(强制转换)为一个 NumericUpDown 控件。如果不成功,则将生成一个 null 值 (C#) 或 Nothing 值 (Visual Basic)。第三行查找当前显示在 NumericUpDown 控件中的答案的长度。第四行通知 NumericUpDown 控件选择答案。现在,当用户导航到此控件时,此控件将激发此事件,以便选择答案。一旦用户开始键入,前面的答案将被清除并替换为新答案。
在此事件处理程序就绪之后,转到“Windows 窗体设计器”并选择其他 NumericUpDown 控件。转到**“属性”对话框中的“事件”**页,向下滚动到 Enter 事件,并选择您刚刚添加的事件处理程序。
然后,对 product 和 quotient NumericUpDown 控件执行同样的操作。
保存并运行程序。古怪行为应当不再发生。
继续或查看
若要转到下一个教程步骤,请参见步骤 6:添加减法问题。
若要返回上一个教程步骤,请参见步骤 4:添加 CheckTheAnswer() 方法。