编程日日帖(1)
编程爱好者
C#
键盘控制焦点移动
很多应用程序,特别是在一些数据库程序中,程序都有输入数据的页面。在频繁的数据输入中,最人性化的设计就是:每填完一个输入框,再按回车键,输入焦点就会移动到下一个输入框上。如果在完成整个页面的输入过程中,发现某个输入框内的内容不正确时,还可以用键盘的上、下键移动输入焦点,而这些操作都不用鼠标点击来实现。在C#的编程中这怎么实现呢?我们来看个示例:
第一步:在Form1上放三个TextBox和一个Button。分别设置它们的属性如下:
Form1: KeyPreview = True
TextBox1 :TabOrder = 0;
TextBox2 :TabOrder = 1;
TextBox3 :TabOrder = 2;
Button1 :TabOrder = 3;
说明:设置 Form1的KeyPreview为True,则可以使Form1上的所有控件都响应键盘事件,设置TabOrder属性后,则焦点就可以根据TabOrder属性值的大小顺序移动。
第二步:定义一个方法如下:
private void FocusMove(object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((e.KeyCode==Keys.Down) || (e.KeyCode==Keys.Enter))
{
SelectNextControl(sender as Control,true,false,false,true);
}
if ((e.KeyCode==Keys.Up))
{
SelectNextControl(sender as Control,false,false,false,true);
}
}
说明:FocusMove方法中的参数sender用于表示当前获得焦点的控件,参数e用于获得键盘输入的数据。使用这个方法判断:如果键盘输入回车键(Keys.Enter)和向下键(Keys.Down)则把焦点移到下一个控件上。如果键盘输入向上键(Keys.Up)则把焦点移到上一个控件上。SelectNextControl就是移动焦点的方法,它的五个参数中,其中第二个参数为true时,焦点向下移动,反之向上。其它的参数作用可参见C#帮助。
第三步:用鼠标在Form1上框选所有控件,然后在属性设置器中找到KeyDown事件,在下拉框中选择我们在第二步中定义的FocusMove方法。至此,控制焦点移动的设置完成。
以上代码在WinXP+VS.net2003中编译通过。
(广西 李健)
VB
测试初始化事件顺序
大家一定使用过Print方法,它可以在容器上输出内容。请看以下一段代码(command1为按钮控件)
Private Sub Form_Load()
print "VB Print Test"
End Sub
Private Sub Command1_Click()
Print "Command1 Print"
End Sub
然后运行程序,将会发现窗体上并没有显示出VB Print Test,而当单击Command1按钮时,将会在窗体上打印出“Command1 Print”,而且并不是在窗体左上角。为什么窗体启动后没有在窗体上打印出“VB Print Test”而单击按钮时就会打印出内容呢?而且打印在第二行,而不是在最左上角呢?这就与窗体的创建加载过程有关了。
窗体事件的执行有先后顺序,为Form_Initialize,Form_Load,Form_Resize,Form_Activate,Form_GotFoucus,Form_Paint……下面简单地验证一下这些顺序。(command1为按钮控件)
Dim sTemp As String
Private Sub Command1_Click()
MsgBox sTemp
End Sub
Private Sub Form_Activate()
sTemp = sTemp & vbCrLf & "Activate事件发生"
End Sub
Private Sub Form_GotFocus()
sTemp = sTemp & vbCrLf & "GotFocus事件发生"
End Sub
Private Sub Form_Initialize()
sTemp = sTemp & vbCrLf & "Initialize事件发生"
End Sub
Private Sub Form_Load()
sTemp = sTemp & vbCrLf & "Load事件发生"
End Sub
Private Sub Form_Paint()
sTemp = sTemp & vbCrLf & "Paint事件发生"
End Sub
Private Sub Form_Resize()
sTemp = sTemp & vbCrLf & "Resize事件发生"
End Sub
单击Command1后将出现提示框,显示出各个事件先后发生的次序。这样就不难明白为什么程序运行后不能打印VB Print Test了,因为把print方法放在了Load过程中,而Paint事件在Load事件后发生,窗体重绘,所以不能看见VB Print Test了。只要是在Paint事件前用print方法,都不能显示。不过,只要将Form的AutoRedraw设置为True,那么将会发现也能正确打印出VB Print Test。AutoRedraw属性与Paint事件密切相关。
(浙江 黄云)