几个注意点
多个按钮可共享一个事件
先看一个例子:
aspx文件:
<asp:Button ID="Button1" runat="server" CommandName="btn1" CommandArgument="1" Text="Button" OnClick="Button1_Click"/>
<asp:Button ID="Button2" runat="server" CommandName="btn2" CommandArgument="2" Text="Button" OnClick="Button1_Click"/>
<asp:Button ID="Button3" runat="server" CommandName="btn3" CommandArgument="3" Text="Button" OnClick="Button1_Click"/>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
protected void Button1_Click(object sender, EventArgs e)
{
//多个按钮可绑定一个事件,通过事件的参数来确定是哪个按钮触发的
string strName = ((Button)sender).CommandName;
string strArg = ((Button)sender).CommandArgument;
switch (strName)
{
case "btn1":
Label1.Text = "点击的第一个btn";
break;
case "btn2":
Label1.Text = "点击的第二个btn";
break;
case "btn3":
Label1.Text = "点击的第三个btn";
break;
default:
break;
}
switch (strArg)
{
case "1":
Label1.Text = "点击的第一个btn";
break;
case "2":
Label1.Text = "点击的第二个btn";
break;
case "3":
Label1.Text = "点击的第三个btn";
break;
default:
break;
}
}
基于此,对于相同的按钮,若要执行类似的操作,可将代码都写在一个事件中。如果有需要可通过按钮的CommandName 或者 CommandArgument来区分究竟是哪个按钮。
不仅是按钮如此,对于类似的操作都可以用一个事件来完成。比如几个CheckBox,如果希望,点击任何一个都能反应出所选中的所有内容,就可以将代码都写在一个事件里面比如CheckBox1_CheckedChanged,然后每个CheckBook的OnCheckedChanged事件都指向所写的CheckBox1_CheckedChanged事件即可。
判断是否为页面第一次加载
很多服务器控件都有AutoPostBack(自动回传属性),在很多情况下,我们都需要将其设置为true。
这样就可能出现一个问题,当发生回传的时候,会导致页面的Page_Load事件再次执行,而在Page_Load事件中一般都是我们对页面所执行的一些初始化设置,我们并不希望它再次执行,因而,对于这些代码就需要检测是否是页面第一次加载,也就是非回传。
下面是一个例子:
static CheckBoxList cblFav = new CheckBoxList();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
cblFav.Items.Add("reading");
cblFav.Items.Add(new ListItem("trip", "001"));
cblFav.Items.Add(new ListItem("music", "002"));
cblFav.Items.Add(new ListItem("sport", "003"));
cblFav.Items.Add(new ListItem("run", "004"));
cblFav.Items.Add(new ListItem("ride", "005"));
cblFav.RepeatColumns = 3;//要显示的列数
cblFav.RepeatDirection = RepeatDirection.Vertical;//列表显示方式
cblFav.AutoPostBack = true;//是否自动回传
}
form1.Controls.Add(cblFav);
}
protected void Button1_Click(object sender, EventArgs e)
{
string mes = "your choose is : ";
foreach (ListItem item in cblFav.Items)
{
if (item.Selected)
{
mes += item.Text+" ";
}
}
Response.Write(mes);
}
如果不将对CheckBoxList的初始化事件写在!Page.IsPostBack,当每次页面自动回传的时候都会再给CheckBookList填下代码块中的内容。
几个属性、方法
对于服务器控件xxxList一般都有以下几个属性
* RepeatColumns 水平显示几列
* RepeatDirection 枚举值,水平/垂直
* Items 列表项目的集合,它的Add方法中可以1、直接写入字符串(将其设为Text,由于未设置value,会默认value等于text) 2、new ListItem(“文本”,”Value”)
文件上传
核心代码
FileUpload1.PostedFile.SaveAs(path);//上传
说明
* FileUpload1为FileUpload控件
* path为文件保存到的绝对路径以及文件名扩展名,示例D:\Demo\0405\SolutionApr05\WebSite\Upload\16-04-05-21-13-00-971.jpg
大文件上传配置
修改web.config
<httpRuntime targetFramework="4.5" executionTimeout="3000" maxRequestLength="1024000"
requestLengthDiskThreshold="100" />
<!--配置 maxRequestLength(文件最大限制,单位KB) 和 requestLengthDiskThreshold(缓存) 属性的值 -->
多文件上传配置
通过Request.Files来获取多个FileUpload控件的文件加入HttpFileCollection集合,然后遍历集合,依次上传。
HttpFileCollection fc = Request.Files;
demo
string path = Server.MapPath("~/Upload/");
//Response.Write(path);
//获取文件上传集合
HttpFileCollection fc = Request.Files;
//遍历上传
Label1.Text = "";
for (int i = 0; i < fc.Count; i++)
{
//重命名 时间+扩展名
string newname = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-fff") + System.IO.Path.GetExtension(fc[i].FileName);
//
try
{
fc[i].SaveAs(path + newname);
Label1.Text += string.Format("上传成功 路径:~/Upload/{0}大小:{1}KB<br>", newname, fc[i].ContentLength / 1024);
}
catch (Exception ex)
{
Label1.Text = "失败!" + ex.Message;
}
}
几个作用代码
- Server.MapPath(path) 返回与指定虚拟路径相对应的物理路径。path为字符串 返回也为字符串
- System.IO.Path.GetExtension(path) 获取扩展名,也可以使用字符串的截取的方式完成
- System.IO.Directory.Exists(path) 判断目录是否存在 path为完整路径
- System.IO.Directory.CreateDirectory(path) 创建目录 path为完整路径
示例:
bool b = false;//类型符合?
string path = Server.MapPath(".");
string fileType = "";//扩展名
string newpath = "";// 上传文件的路径
//是否有文件
if (FileUpload1.HasFile)
{
//判断类型
fileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower().ToString();//获取扩展名
string[] typeAllow = { ".gif", ".jpeg", ".jpg", "png" };
foreach (string temp in typeAllow)
{
if (temp == fileType)
{
b = true;
break;
}
}
//上传
if (!b)
{
Response.Write("<script>alert('文件类型不允许,必须是图片')</script>");
}
else
{
if (!System.IO.Directory.Exists(path + "/Upload"))//目录是否存在
{
System.IO.Directory.CreateDirectory(path + "/Upload");
}
//上传
try
{
//上传
newpath = string.Format("/Upload/{0}{1}", string.Format("{0:yy-MM-dd-HH-mm-ss-fff}", System.DateTime.Now), fileType);
//重新命名,小时HH大写表示24小时制,否则为12小时制
FileUpload1.PostedFile.SaveAs(path + newpath);//上传
Label1.Text = string.Format("上传成功!\r\n文件路径:~{0}\r\n 文件大小:{1}KB", newpath, FileUpload1.PostedFile.ContentLength / 1024);
Image1.ImageUrl = "~" + newpath;//显示到img
}
catch (Exception ex)
{
Label1.Text = "上传失败! " + ex.Message;
}
}
}
}
表控件Table
服务器端的table,格式如下:
<asp:Table ID="Table1" runat="server" Height="22px" Width="30px">
<asp:TableRow runat="server">
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
</asp:TableRow>
<asp:TableRow runat="server">
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
</asp:TableRow>
<asp:TableRow runat="server">
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
</asp:TableRow>
</asp:Table>
demo
Table t =new Table();
for (int i = 1; i < 5; i++)
{
TableRow tr = new TableRow();
for (int j = 1; j < 5; j++)
{
TableCell td = new TableCell();
td.Text = string.Format("{0} {1}",i,j);
tr.Cells.Add(td);
}
t.Rows.Add(tr);
}
t.BorderStyle = BorderStyle.Solid;
t.GridLines = GridLines.Both;
form1.Controls.Add(t);
容器控件
ASP .NET 提供两种容器控件 Panel面板控件和PlaceHolder 控件
Panel
在Panel中可以再加入多个控件,一般用于控件分组以及控制几个控件的显示与否
PlaceHolder
PlaceHolder 有与Panel类似的功能,但PlaceHolder控件不能直接加入子控件,其添加工作必须在程序中完成。主要用于在程序运行过程中动态地向PlaceHolder中加入其他控件。此控件中仅仅显示其子控件,自己本身不具有HTML输出
代码示例:
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:Button ID="Button1" runat="server" Text="添加内容" OnClick="Button1_Click" />
protected void Button1_Click(object sender, EventArgs e)
{
Label label1 = new Label();
label1.Text = "PlaceHolder添加";
TextBox txt1 = new TextBox();
Image img1 = new Image();
img1.ImageUrl = "~/Upload/16-04-05-12-40-11.jpg";
PlaceHolder1.Controls.Add(label1);
PlaceHolder1.Controls.Add(txt1);
PlaceHolder1.Controls.Add(img1);
PlaceHolder1.Controls.Add(new LiteralControl("<br>"));
PlaceHolder1.Controls.Add(new LiteralControl("<input type='Text'>"));
//以上代码中“LiteralControl”表示:HTML 元素文本和 ASP.NET 页面中不需要服务器上处理的任何其他字符串,可以不再服务端处理的标记。
}