如何在ASP.Net页面中实现动态添加div以及div中的控件?

时间:2021-12-08 04:54:54
      我在做的一个信息管理系统,其中一个模块是上传用户的各种资料,资料有8种左右,资料的数量不固定,我想在页面中实现的效果是,每单击一次“上传资料”按钮,动态添加一个DIV,DIV中有一组控件,一个DropDownList控件用来绑定资料类型,一个TextBox控件,一个FileUpload控件。
     现在我写的代码如下:

        int n = 1;

        protected void btnAdd_Click(object sender, EventArgs e)
        {
            DropDownList ddlDocumentType = new DropDownList();
            ddlDocumentType.ID = ddlDocumentType + n.ToString();
            string strSql = "select a.* from dictionary a join dicType b on b.id=a.dicTypeId and b.typeName='资料类型' and a.d_flag=0 and b.d_flag=0 order by a.n";
            DataSet ds = bllCommOper.GetDataSetByCondition(strSql);
            DataTable dt = ds.Tables[0];
            DataRow dr = dt.NewRow();
            dr["value"] = "请选择资料类型";
            dr["id"] = 0;
            dt.Rows.InsertAt(dr, 0);
            ddlDocumentType.DataSource = dt;
            ddlDocumentType.DataTextField = "value";
            ddlDocumentType.DataValueField = "Id";
            ddlDocumentType.DataBind();
            docDiv.Controls.Add(ddlDocumentType);

            TextBox txtDocumentUrl = new TextBox();
            txtDocumentUrl.ID = txtDocumentUrl + n.ToString();
            docDiv.Controls.Add(txtDocumentUrl);
            FileUpload fileUploadDocument = new FileUpload();

            fileUploadDocument.ID = fileUploadDocument + n.ToString();
            docDiv.Controls.Add(fileUploadDocument);

            n++;

        }

      目前单击“上传资料”按钮就是btnAdd按钮,只能添加一组控件。
      而我想实现的效果是,每单击一次btnAdd按钮,即添加一组控件,用来上传需要的各种资料。
      请问我的程序应该如何修改?请大家帮忙,谢谢!

8 个解决方案

#1


将你的一组控件做成用户控件,动态添加时就添加用户控件

#2


另外int n = 1;这个改成
int n
{
get
{
   return ViewState["Number"]==null?1:(int)ViewState["Number"];
}
set
{
ViewState["Number"]=value;
}
}

#3


在Page_Load里也要执行添加事件,不然刷新后之前添加的就没了,根据n执行对应次数,另外别忘了赋id,负责net无法从ViewState中恢复对应的值到正确的位置

#4


没必要添加div  自己写个控件 设置好属性  绑定好事件 添加进去就好了

#5


你应该先学习一下 DataList、ListView、Repeater之类的控件如何处理这类需求(包括如何设计模板)。

但是要注意,FileUpload是不可能在刷新时保持之前用户设置的文件信息的。这跟asp.net没有关系,是浏览器本来就不允许服务器端程序去设置读取文件的路径(不允许钓鱼网站去偷取用户电脑里的资料文件),所以实际上,这种需求用asp.net来做是个“坑”,本来就只能用“不回发的”方式来处理。

#6


在编写 asp.net 程序时,即使你做最简单的东西,也应该做这样一个简单的Button挥发测试:

拖一个 Button 到页面上,然后双击它,产生回发(空)代码。这里你可以写、可以不写什么调试代码,反正是保证可以验证到能够对页面注册一个实际可回发的按钮行为就行了。

然后在你编写asp.net程序时,调试执行时,时不时地去点击一下这个Button。正常情况下,你随时点击它,那么你也面上的任何状态都不会丢失(例如某些所谓的“动态添加的控件”丢失了)、也不会混乱(例如某些动态设置的属性又没了)。

而一旦你发现有错了(例如你发现n总是等于初始值),那么就别往下继续设计什么高大上的asp.net代码了。先从开头重新学习asp.net为好。许多人不遵守基本的安全原则,带病“设计”程序,最后弄出来一个又大又诡异的程序出来了。

#7


不能用jquery实现吗?直接前台生成

#8


谢谢各位高手和热心的朋友,综合各位的意见,我认为用服务器按钮进行添加,的确可能有问题,时间比较紧,现正在改用jquery处理!如果有问题,请大家继续指导!
另外我的确是在边做边学习的阶段,希望大家多指教!

#1


将你的一组控件做成用户控件,动态添加时就添加用户控件

#2


另外int n = 1;这个改成
int n
{
get
{
   return ViewState["Number"]==null?1:(int)ViewState["Number"];
}
set
{
ViewState["Number"]=value;
}
}

#3


在Page_Load里也要执行添加事件,不然刷新后之前添加的就没了,根据n执行对应次数,另外别忘了赋id,负责net无法从ViewState中恢复对应的值到正确的位置

#4


没必要添加div  自己写个控件 设置好属性  绑定好事件 添加进去就好了

#5


你应该先学习一下 DataList、ListView、Repeater之类的控件如何处理这类需求(包括如何设计模板)。

但是要注意,FileUpload是不可能在刷新时保持之前用户设置的文件信息的。这跟asp.net没有关系,是浏览器本来就不允许服务器端程序去设置读取文件的路径(不允许钓鱼网站去偷取用户电脑里的资料文件),所以实际上,这种需求用asp.net来做是个“坑”,本来就只能用“不回发的”方式来处理。

#6


在编写 asp.net 程序时,即使你做最简单的东西,也应该做这样一个简单的Button挥发测试:

拖一个 Button 到页面上,然后双击它,产生回发(空)代码。这里你可以写、可以不写什么调试代码,反正是保证可以验证到能够对页面注册一个实际可回发的按钮行为就行了。

然后在你编写asp.net程序时,调试执行时,时不时地去点击一下这个Button。正常情况下,你随时点击它,那么你也面上的任何状态都不会丢失(例如某些所谓的“动态添加的控件”丢失了)、也不会混乱(例如某些动态设置的属性又没了)。

而一旦你发现有错了(例如你发现n总是等于初始值),那么就别往下继续设计什么高大上的asp.net代码了。先从开头重新学习asp.net为好。许多人不遵守基本的安全原则,带病“设计”程序,最后弄出来一个又大又诡异的程序出来了。

#7


不能用jquery实现吗?直接前台生成

#8


谢谢各位高手和热心的朋友,综合各位的意见,我认为用服务器按钮进行添加,的确可能有问题,时间比较紧,现正在改用jquery处理!如果有问题,请大家继续指导!
另外我的确是在边做边学习的阶段,希望大家多指教!