.NET服务器控件

本文介绍ASP.NET中控件的使用技巧,包括按钮、CheckBox、Table等控件的事件绑定与动态添加内容的方法,并详细讲解了文件上传功能的实现步骤及配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几个注意点

多个按钮可共享一个事件

先看一个例子:
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+"&nbsp;";
            }
        }
        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 页面中不需要服务器上处理的任何其他字符串,可以不再服务端处理的标记。
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值