先前关于asp.net的博客随笔都是记录一些触发事件的控件代码,即对应的控件有对应的后台代码,今天在这个基础上提升了一点点,学习了PageLoad的基本思路以及页面加载时控件执行事件的先后顺序。
开发环境:Microsoft visual Studio 2010
一、页面加载的顺序
PageLoad -> n个控件按照创建的先后顺序执行事件(DropdownList、CheckBox等等)->Button
PageLoad永远是第一个执行的,Button永远是最后执行的
二、简单的实例——实现输入一个整数n来创建n个文本框以及计算总共有多少个文本框
先上效果图:
由图可知,在文本框中输入一个整数,点击创建按钮,就可以创建出n个文本框,再点击“有多少文本框”按钮,就可以在多行文本框中输出文本框的总数。
前端代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test01.aspx.cs" Inherits="test01" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="创建" onclick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="有多少文本框" onclick="Button2_Click" />
<asp:Button ID="Button3" runat="server" Text="求和" onclick="Button3_Click" />
<br />
<br />
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<p>
<asp:TextBox ID="TextBox2" runat="server" TextMode="MultiLine" Height="62px"
Width="173px"></asp:TextBox>
</p>
</div>
</form>
</body>
</html>
按理来说,我们应该在各自的button按钮当中编写单独的代码,如下段:
后端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class test01 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
int index = int.Parse(TextBox1.Text);
if (index > 0)
{
for (int i = 0; i < index; i++)
{
TextBox textbox = new TextBox();
textbox.Text = i.ToString();
Panel1.Controls.Add(textbox);
}
}
}
protected void Button2_Click(object sender, EventArgs e)
{
TextBox2.Text = Panel1.Controls.Count.ToString();
}
protected void Button3_Click(object sender, EventArgs e)
{
double total = 0;
foreach (Control ctl in Panel1.Controls)
{
if (ctl is TextBox)
{
TextBox txt = (TextBox)ctl;
total += double.Parse(txt.Text);
}
}
Button3.Text = total.ToString();
}
}
主要看Button1_Click方法的代码,逻辑上说没毛病,运行的时候点击创建也可以创建出来,但是当我们点击“有多少文本框”按钮的时候,就会出现创建的文本框清空了? 这是页面加载顺序的原因,上面我们说过,Button是最后执行的,那么当我们点击Button2(有多少文本框)按钮的时候,页面会重新加载,加载流程是这样的:先看PageLoad有没有东西,ok没有,继续往下看,也没有,最后执行Button2的事件,因为创建按钮没有被点击,所以没有触发事件执行,里面的代码没有跑起来,所以才会出现创建的文本框清空的情况。
那么我们怎么去解决这种情况呢?把创建按钮的代码放到PageLoad里面。因为PageLoad是永远会执行的,而其他控件则需要判断是否被点击或被操作等等因素,所以代码放在PageLoad和放在button是等价的。
改进后的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class test01 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int index = 0;
try
{
index = int.Parse(TextBox1.Text);
}
catch { }
if (index > 0)
{
for (int i = 0; i < index; i++)
{
TextBox textbox = new TextBox();
textbox.Text = i.ToString();
Panel1.Controls.Add(textbox);
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
}
protected void Button2_Click(object sender, EventArgs e)
{
TextBox2.Text = Panel1.Controls.Count.ToString();
}
protected void Button3_Click(object sender, EventArgs e)
{
double total = 0;
foreach (Control ctl in Panel1.Controls)
{
if (ctl is TextBox)
{
TextBox txt = (TextBox)ctl;
total += double.Parse(txt.Text);
}
}
Button3.Text = total.ToString();
}
}
try
{
index = int.Parse(TextBox1.Text);
}
catch { }
这里用try方法来防止数据报错
改进完后,文本框就不会消失了,计算文本框的功能也可以实现。
第三个按钮是求和,即求创建出来的每个文本框里面的text转换成整数之后的和。