1、新建工程命名为windowsformtextboxvalidation。
2、添加5个label分别命名为label_name、label_address、label_occupation、label_age、label_output,text属性分别为:姓名、地址、工作、年龄、输出。添加5个textbox分别命名为textbox_name、textbox_address、textbox_occupation、textbox_age、textbox_output。添加2个按钮,分别命名为btn_ok、btn_help,text属性分别为确定、帮助。
3、将textbox_address、textbox_output的multiline属性改成true。
4、把窗体的text值设成textboxtestvalidation。
5、把textbox_output的readonly属性设成true。
6、把textbox_address和textbox_output的scrollbar属性值设为true。
7、将btn_help的causesvalidation属性设置为false。
8、设置所有类型控件的anchor属性。首先按住ctrl键,依次选择除了textbox_output之外的所有文本框控件,在properties窗口中把anchor属性值设置为top、left、right,然后选择textbox_output将他的anchor属性设置成top、bottom、left、right,最后把两个按钮的anchor属性设置成top、right。
9、运行程序看效果。
10、给btn_ok填写代码,如下:
private void btn_ok_click(object sender, eventargs e)
{
string output;
output = "姓名: " + this.textbox_name.text + “\r\n”;
output += "地址: " + this.textbox_address.text + “\r\n”;
output += "工作: " + this.textbox_occupation.text + “\r\n”;
output += "年龄: " + this.textbox_age.text + “\r\n”;
this.textbox_output.text = output;
}
11、给btn_help填写代码,如下:
private void btn_help_click(object sender, eventargs e)
{
string output;
output = “姓名 = 你的名字\r\n”;
output += “地址 = 你的家庭住址\r\n”;
output += “工作 = 这里只允许填写"程序员”\r\n";
output += “年龄 = 你的年龄\r\n”;
this.textbox_output.text = output;
}
12、在插入用户信息的时候无需检查信息是否正确,这就是说,必须在其他地方进行验证检查。此时需要满足的条件为:用户名不能为空;用户的年龄必须是一个大于或等于0 的数字;用户的职业必须是“程序员”或者空;用户的地址不能为空。
13、此时应该考虑当用户没有输入完成信息时不能点击“确定”按钮。所以在窗体构造函数中将btn_ok的enable属性设成false。
public form1()
{
initializecomponent();
this.buttonok.enabled = false;
}
14、给textbox_name添加validating事件代码,如下:
private void textbox_name_validating(object sender, canceleventargs e)
{
if (textbox_name.text.length == 0)
{
textbox_name.backcolor = color.red;
//textbox_name.tag = false; //后加入
}
else
{
textbox_name.backcolor = system.drawing.systemcolors.window;
}
}
15、运行程序,演示两种情况,首先,当text为空时光标离开textbox_name,其次当text不为空时光标离开textbox_name。
16、给textbox_address添加validating事件代码,如下:
private void textbox_address_validating(object sender, canceleventargs e)
{
if (textbox_address.text.length == 0)
{
textbox_address.backcolor = color.red;
//textbox_address.tag = false; //后加入
}
else
{
textbox_address.backcolor = system.drawing.systemcolors.window;
}
}
17、这里我们如何告诉按钮btn_ok输入的信息合法并使btn_ok可用呢?这里采用控件tag属性来完成这项任务,这里我们可以吧tag属性理解为控件的状态。tag属性是用来存储控件信息的属性值。当通过windows form 设计器给属性赋值时,就只能给它赋一个字符串值。所以这里我们在form的构造函数中添加如下代码而不选择在窗体设计器中添加属性:
public form1()
{
initializecomponent();
this.buttonok.enabled = false;
// tag values for testing if the data is valid
this.textbox_address.tag = false;
this.textbox_age.tag = false;
this.textbox_name.tag = false;
this.textbox_occupation.tag = false;
}
18、给textbox_age添加keypress事件代码如下:
private void textbox_age_keypress(object sender, keypresseventargs e)
{
if ((e.keychar < 48 || e.keychar > 57) && e.keychar != 8)
{
e.handled = true;
}
}
19、给textbox_occupation添加validating事件,代码如下:
private void textbox_occupation_validating(object sender, canceleventargs e)
{
if (textbox_occupation.text.compareto(“programmer”) == 0 || textbox_occupation.text.length == 0)
{
textbox_occupation.backcolor = systemcolors.window;
textbox_occupation.tag = true;
}
else
{
textbox_occupation.backcolor = color.red;
textbox_occupation.tag = false;
}
}
20、这是我们考虑通过对textbox_name、textbox_age、textbox_occupation、textbox_address的有效性来判断btn_ok的可用与否,此时添加方法validateok(),代码如下:
private void validateok()
{
this.btn_ok.enabled = (bool)(this.textbox_address.tag) &&
(bool)(this.textbox_age.tag) &&
(bool)(this.textbox_occupation.tag) &&
(bool)(this.textbox_name.tag);
}
21、并在每个textbox中的validating代码中添加该函数。修改代码如下:
private void textbox_name_validating(object sender, canceleventargs e)
{
if (textbox_name.text.length == 0)
{
textbox_name.backcolor = color.red;
textbox_name.tag = false;
}
else
{
textbox_name.backcolor = system.drawing.systemcolors.window;
textbox_name.tag = true;
}
validateok();
}
private void textbox_address_validating(object sender, canceleventargs e)
{
if (textbox_address.text.length == 0)
{
textbox_address.backcolor = color.red;
textbox_address.tag = false;
}
else
{
textbox_address.backcolor = system.drawing.systemcolors.window;
textbox_address.tag = true;
}
validateok();
}
private void textbox_occupation_validating(object sender, canceleventargs e)
{
if (textbox_occupation.text.compareto("programmer") == 0 || textbox_occupation.text.length == 0)
{
textbox_occupation.backcolor = systemcolors.window;
textbox_occupation.tag = true;
}
else
{
textbox_occupation.backcolor = color.red;
textbox_occupation.tag = false;
}
validateok();
}
private void textbox_age_keypress(object sender, keypresseventargs e)
{
if ((e.keychar < 48 || e.keychar > 57) && e.keychar != 8)
{
e.handled = true;
}
validateok();
}
22、给textbox_age添加validating事件,代码如下:
private void textbox_age_validating(object sender, canceleventargs e)
{
if (textbox_age.text.length == 0)
{
textbox_age.backcolor = color.red;
textbox_age.tag = false;
}
else
{
textbox_age.backcolor = system.drawing.systemcolors.window;
textbox_age.tag = true;
}
validateok();
}
23、运行应用程序。
24、回想程序,我们发现textbox_name、textbox_age、textbox_address相应的validating事件都是一样的,均为长度不能是0,所以这里考虑合并代码。首先创建事件处理的函数,代码如下:(函数名只需模仿前面的任意一个validating事件的函数名即可)
private void textboxempty_validating(object sender, canceleventargs e)
{
textbox tb = (textbox)sender;
if (tb.text.length == 0)
{
tb.backcolor = color.red;
tb.tag = false;
}
else
{
tb.backcolor = system.drawing.systemcolors.window;
tb.tag = true;
}
validateok();
}
25、将textboxempty_validating替代textbox_name、textbox_age、textbox_address原有的validating事件名。
26、运行程序。
27、事件的添加也可以通过代码实现,在构造函数中添加代码如下,并删除事件窗口的对应函数。
public form1()
{
initializecomponent();
this.btn_ok.enabled = false;
this.textbox_address.tag = false;
this.textbox_age.tag = false;
this.textbox_name.tag = false;
this.textbox_occupation.tag = false;
this.textbox_name.validating+=new canceleventhandler(textboxempty_validating);
this.textbox_address.validating+=new canceleventhandler(textboxempty_validating);
this.textbox_age.validating+= new canceleventhandler(textboxempty_validating);
}
28、如果用户在文本框出输入里有效的文本,使btn_ok的enable属性值为true,紧接着修改文本框的输入使之成为非法治,此时发现btn_ok仍然为可用状态,此时由于光标没有离开该textbox所以是无法触发validating事件的。所以此时需要添加textchanged事件来解决该问题。
29、给四个textbox控件生成一个共同的textchanged事件。选择所有的4个textbox控件。然后在属性窗口中选择textchanged事件在文本框中输入事件函数名称textbox_textchanged,然后回车。添加的代码如下:
private void textbox_textchanged(object sender, eventargs e)
{
textbox tb = (textbox)sender;
if (tb.text.length == 0 && tb != textbox_occupation)
{
tb.tag = false;
tb.backcolor = color.red;
}
else if (tb == textbox_occupation && (tb.text.length != 0 && tb.text.compareto(“programmer”) != 0))
{
tb.tag = false;
}
else
{
tb.tag = true;
tb.backcolor = systemcolors.window;
}
validateok();
}
30、此时发现初始状态下如果,光标不经过textbox_occupation,只对其他三个textbox输入合法值,btn_ok仍然属于不可用状态,此时必须使textbox_occupation至少选中或填写一次正确值才可以是的btn_ok成为可用。这是不合理的。此时考虑修改text_box_occupation.tag的初始值。代码修改如下:
public partial class form1 : form
{
public form1()
{
initializecomponent();
this.btn_ok.enabled = false;
this.textbox_address.tag = false;
this.textbox_age.tag = false;
this.textbox_name.tag = false;
this.textbox_occupation.tag = true;
this.textbox_name.validating+=new canceleventhandler(textboxempty_validating);
this.textbox_address.validating+=new canceleventhandler(textboxempty_validating);
this.textbox_age.validating+= new canceleventhandler(textboxempty_validating);
}

发表评论