我现在用的是这个方法来向页面添加控件
TextBox newControls=new TextBox();
newControls.ID = "textbox1";
newControls.Width = 100;
newControls.Style.Add("LEFT","txt1.text");
newControls.Style.Add("TOP","txt2.text");

Page.Controls[1].Controls.Add(newControls);
但用这个方法定义出的控件页面一刷新就没了,而且不能加载事件。知不知道有什么方法可以让这样添加的控件一直留在页面上,并且把相关信息保存到数据库里,下次能动态的显示出来,并且要能加载事件。

解决方案 »

  1.   

    你可以让这个控件根据你的条件来进行显示与否
    if(你的条件==true)
        Botton1.Visable = true;
    else
           Botton1.Visable = false;
      

  2.   

    参考:http://blog.csdn.net/xinyulou/archive/2004/08/04/60677.aspx
      

  3.   

    不难啊
    建立一个保存控件属性的数据库,在page_load里面读取(并转换)保存的控件,再添加到页面上就可以了。 你做的这个东西很高级嘛
      

  4.   

    http://blog.joycode.com/saucer/posts/19456.aspx
      

  5.   

    上面的连接我看了,和我的要求还是有区别阿,我要的是用户能动态的往页面上加n个控件,比如他填写了一个控件的x坐标和y坐标,然后还可以选择添加的控件类型比如是一个txtbox(也可以是其它的)最后按“添加”按钮,那么这个控件才被添加到页面上,所以这好像不是写在page_load里这么简单吧
      

  6.   

    参见微软的protal
    这个网站有www.asp.net
      

  7.   

    给页面加控件很简单哈,但控件的事件与什么代码绑定呢?另外,被修改的页面是要被保存为html还是aspx+cs呢?
      

  8.   

    加控件是可以了,问题是页面一刷新就没了,和什么代码绑定无所谓,关键是怎么加事件啊
    保存为html也可以吗?应该要保存为aspx的吧
      

  9.   

    你要给页面加上一个控件,然后自动的给生成aspx的代码?例如:<input type="text" runat="server" id="username">
      

  10.   

    我要的是能让用户来动态的往一个页面上添加各种控件,他可以做的就是填写了一个控件的x坐标和y坐标等等,然后还可以选择添加的控件类型比如是一个txtbox(也可以是其它的)最后按“添加”按钮,那么这个控件才被添加到页面上,以此类推,这个我已经可以实现了,“添加”按钮的代码部分如下TextBox newControls=new TextBox();
    newControls.ID = "textbox1";
    newControls.Width = 100;
    newControls.Style.Add("LEFT","txt1.text");
    newControls.Style.Add("TOP","txt2.text");

    Page.Controls[1].Controls.Add(newControls);
    但用这个方法定义出的控件页面一刷新就没了,而且不能加载事件。知不知道有什么方法可以让这样添加的控件一直留在页面上,并且把相关信息保存到数据库里,下次能动态的显示出来,并且其中某些控件要能加载事件。当然事件应该就是一些简单按钮点击事件。
      

  11.   

    除非你每次pageLoad时候都执行你写的那段代码,否则当然刷新就没有了。
    你可以把用户添加了的控件放到数组中存在session里
    每次pageload时候通过判断某些条件从session中取出来
      

  12.   

    如果仅仅如此,很容易实现哈。private PlaceHolder Collection;
    Page_Init()
    {
      if ( Session["collection"] == null )
      {
        Collection = new PlaceHolder();
      }
      else
        Collection = (PlaceHolder) Session["collection"];  this.Controls.Add( Collection );  //然后,对Collection进行Controls.Add等操作。
    }Page_Unload()
    {
      Session["collection"] = Collection;
    }
      

  13.   

    不好意思,小弟我太了解PlaceHolder 这个东西,能不能给我说明一下,谢谢了
      

  14.   

    你可以就把它看成一个容器,
    你本来是往页面上填加控件,变成往这个容器里添加。
    这个容器在Unload的时候自动存到Session里面去,保证刷新或者其他操作之后,这些控件还在。
      

  15.   

    你刷新后当然没有了。你加的控件是类生成的对象的物件,而不是类的物件。如果你要想做到网类中加物件,我觉得是不行的。(也就是等你页面关闭以后,下次再加载的时候,你加的物件不存在!)   不过只要你不关闭这个页面,刷新、点button提交,我想是可以保持这个物件的(当然client端的script事件也会保持)。
    =======>你试试把所加的物件放在"Panel"等能容乃物件的服务器控件里面,估计,通过它的viewState属性为true,能保持住控件。   还有你想添加服务器端的事件,也只有让控件放在你已知的服务器控件中,然后让事件上浮给父控件,再处理!
    ======>其实也好象不行,处理事件要的代码除非你早写好了。否则你无法往cs文件中添加新的代码,那不等于这个程序的运行能够修改程序本身的源代码了。
      

  16.   

    还有我不是在page_load里加控件的,而是在一个button事件里加的,所以你说得好像不行嘛
      

  17.   

    你是先定义一个容器如panel放在页面上,不详看见 就hidden再望里面加(加时显示它)
      

  18.   

    因为这个项目需要处理的事情不确定,随时可能会有增加,每新增一个处理事项,就要为它设定一个处理页面,当然这些页面的处理事件无非就是信息的保存修改删除,但不可能通用一个页面,所以只能让用户自己定义页面上的文本框阿什么的.
    动态生成aspx文件,事件固定几个,固定cs文件处理所有的事件。
      

  19.   

    做两个页面第一个设置,生成控件,任何处理程序都更换到拧外的页面去执行。象JSP那样。
      

  20.   

    为什么我放在panel里和PlaceHolder里页面一刷新控件还是没了嘛
      

  21.   

    Ivony() ,你说动态生成aspx文件,但不编译的话好像没有用的吧,另外我页面上的空间数类型都不确定,我的事件怎么写呢?
      

  22.   

    gxboy(Blin 小学生学.NET) ( ) 信誉:80  2005-02-19 16:07:00  得分: 0  
     你的最终目的是什么/
      
     
    因为这个项目需要处理的事情不确定,随时可能会有增加,每新增一个处理事项,就要为它设定一个处理页面,当然这些页面的处理事件无非就是信息的保存修改删除,但不可能通用一个页面,所以只能让用户自己定义页面上的文本框阿什么的.
      

  23.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace MZ99.Trade.Test
    {
      /// <summary>
      /// Test25 的摘要说明。
      /// </summary>
      public class Test25 : System.Web.UI.Page
      {
        protected System.Web.UI.WebControls.Button Button1;
        protected System.Web.UI.WebControls.TextBox TextBox1;    private PlaceHolder Collection;    protected Test25()
        {
          Init += new EventHandler(Test25_Init);
          Unload += new EventHandler(Test25_Unload);
        }
            private void Page_Load(object sender, System.EventArgs e)
        {
          // 在此处放置用户代码以初始化页面
        }    #region Web 窗体设计器生成的代码
        override protected void OnInit(EventArgs e)
        {
          //
          // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
          //
          InitializeComponent();
          base.OnInit(e);
        }

        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {    
          this.Button1.Click += new System.EventHandler(this.Button1_Click);
          this.Load += new System.EventHandler(this.Page_Load);    }
        #endregion    private void Button1_Click(object sender, System.EventArgs e)
        {
          Label label = new Label();
          label.ID = Images.getRandomSerial();//获得随机字符串的函数
          label.Text = TextBox1.Text;
          Collection.Controls.Add( label );
        }    private void Test25_Init(object sender, EventArgs e)
        {
          if ( Session["collection"] == null )
            Collection = new PlaceHolder();
          else
            Collection = (PlaceHolder) Session["collection"];      this.Controls.Add( Collection );
        }    private void Test25_Unload(object sender, EventArgs e)
        {
          Session["collection"] = Collection;
        }
      }
    }
      

  24.   

    放html控件总有吧?纯html的。放服务器控件恐怕是不行的。
    服务器控件总是要到父控件注册。
    请高手吧.没办法了
      

  25.   

    动态生成aspx文件,事件固定几个,固定cs文件处理所有的事件
    --------------------------------------------------------
    ms的ASP.NET开发环境,我每天用的visual studio.net2003的主要功能好象就是这功能吧。楼主要使用者来写事件程序代码吗?如果是你事先写好,ms为什么不为我们写好aspx和cs.
      

  26.   

    Ivony() ,非常感谢,现在添加htmlcontrol可以了,页面刷新也不会没有了,但添加webcontrol他报“类型“Button”的控件“button1”必须放在具有 runat=server 的窗体标记内。 ”还有private void Test25_Init(object sender, EventArgs e)
        {
          if ( Session["collection"] == null )
            Collection = new PlaceHolder();
          else
            Collection = (PlaceHolder) Session["collection"];      this.Controls.Add( Collection );
        }    private void Test25_Unload(object sender, EventArgs e)
        {
          Session["collection"] = Collection;
        }
    这段代码老实说我不太明白是什么意思
      

  27.   

    还有private void Test25_Init(object sender, EventArgs e)
        {
          if ( Session["collection"] == null )//如果Session中没有我们的控件容器。
            Collection = new PlaceHolder();//创建一个。
          else
            Collection = (PlaceHolder) Session["collection"];//否则将容器从Session中还原。      this.Controls.Add( Collection );//将这个控件容器添加到页面上
        }    private void Test25_Unload(object sender, EventArgs e)
        {
          Session["collection"] = Collection;//在页面显示完毕后,将我们的控件容器(以及里面所有的控件)放到Session中,以保证刷新和回发时我们动态添加的控件不会丢掉。
        }
    Ivony() ,非常感谢,现在添加htmlcontrol可以了,页面刷新也不会没有了,但添加webcontrol他报“类型“Button”的控件“button1”必须放在具有 runat=server 的窗体标记内。 ”========================一般来说是不推荐用WebControls,要解决这个问题也很简单:      this.Controls.Add( Collection );改为:this.FindControl("form1"/*这里是那个<form runat=server>的id号*/).Controls.Add( Collection )
      

  28.   

    动态生成aspx文件,事件固定几个,固定cs文件处理所有的事件我觉得这个好像不太可行的,动态生成的aspx文件也要编译过一次才有效的阿
      

  29.   

    我觉得这个好像不太可行的,动态生成的aspx文件也要编译过一次才有效的阿
    aspx文件不需要编译。第一次访问的时候自动编译。
      

  30.   

    其实,这个东西并不是做不出来,但是太复杂太难了,建议你可以到网上查查有没有现成的。当然,如果是自己爱好,可以找一些有相同爱好的人一起组个团队什么的来研究吧。其实,建议你先摆脱ServerFrom和WebControls的束缚,然后彻底弄清楚System.Web.UI.Control以及它的派生类各种工作原理。这个东西其实往简单说,就俩部分,动态生成表单和动态生成SQL语句。
      

  31.   

    Ivony() ,你说的动态生成sql语句是不是就是指每添加一个控件sql语句就动态添加一部分,最后就生成一句完整的sql语句阿。还有动态生成表单是什么意思?
    大家多帮忙,今天老板就要看结果了
      

  32.   

    动态生成表单是指,根据用户的设置,在页面上动态的生成表单和输入控件,例如我在数据库中创建一个表:idlabel 标题
    name  控件名
    x     位置
    y     位置
    type  是文本框还是下拉列表框还是其他什么
    width 宽度
    style 样式DataSource 当控件为下拉列表等东西时,那些选项是什么。form  隶属于哪一个表单dataTable 与数据库中的哪一个表绑定
    dataField 与数据库里的哪一个字段绑定。
    页面处理程序从数据库中取得这些信息,并动态的向页面上添加这些控件。
    动态生成SQL语句是指,页面处理程序通过分析提交的数据,动态的生成Insert、Update、Delete和Select语句。
      

  33.   

    Ivony() ,你说的动态生成sql语句是不是就是指每添加一个控件sql语句就动态添加一部分,最后就生成一句完整的sql语句阿。那我这个说法对吗?
      

  34.   

    或者说sql语句应该是在用户添加页面控件时动态完成的,并存入数据库,到时把它调出来就可以了,这样可行吗?
      

  35.   

    这个方法定义出的控件页面一刷新就没了:
    在Page_PreRender中写入
    TextBox newControls=new TextBox();
    newControls.ID = "textbox1";
    newControls.Width = 100;
    newControls.Style.Add("LEFT","txt1.text");
    newControls.Style.Add("TOP","txt2.text");

    Page.Controls[1].Controls.Add(newControls);
    部分
    而且不能加载事件:
    建立自己的事件和事件委托。
      

  36.   

    你可以重写Page_PreRender事件,在这里面做添加的工作。事件就要自己写了,申明一个事件,给事件加委托,确定事件的类型。做处理。看了半天不知道是想做什么的。所以按自己的想法说说。也许会有更好的办法。
      

  37.   

    呵呵,谢谢先。其实在页面上添加控件并保留在另一个高手帮助下已经可以了, bidisty(浪漫草) 可以看看前面的。现在我要实现的就是怎样对这些动态添加的控件加载事件了,问题就在于控件的数量和类型不确定,都是用户动态加的,所以sql语句不是很好写,而且怎样加载到一个buutton_click事件中也是个问题。
      

  38.   

    可不可以这样!因为,每次刷新后都是从新读取你初始的代码!而加入的空间不没有真的写入代码,而是靠一些函数的支持!也就是说状态不能得以保存,可以用数据库或xml来保存这些状态,在页面的初始代码中加入,读取这些状态的函数!
      

  39.   

    xiaoniaofei(xiaoniao) ,其实保存页面上的控件这个问题已经解决了,你可以看看上面的回答,不过还是要谢谢。
    现在我需要的是加载事件的方法。
      

  40.   

    我想了一下,关键是cs文件中如果没有protected System.Web.UI.WebControls.TextBox tb1;这种定义的话,就没办法取出某个文本框的值了吧。那么想把写在这些控件内的值保存也就不行了
      

  41.   

    Ivony() ,你说的动态生成sql语句是不是就是指每添加一个控件sql语句就动态添加一部分,最后就生成一句完整的sql语句阿。那我这个说法对吗?
    譬如说这样:
    每一个输入控件对应到数据库中某个表的某个字段上。当提交表单的时候,根据对应关系自动的生成SQL语句更新数据库
    或者说sql语句应该是在用户添加页面控件时动态完成的,并存入数据库,到时把它调出来就可以了,这样可行吗?这样也是可行的,在添加页面控件完成后,自动生成一个用于该页面更新的存储过程。
      

  42.   

    添加的时候这样写不知道可不可以:
    TextBox newControls=new TextBox();
    newControls.ID = "textbox1";
    newControls.Width = 100;
    newControls.Style.Add("LEFT","txt1.text");
    newControls.Style.Add("TOP","txt2.text");newControls.CommandName = "aa"

    Page.Controls[1].Controls.Add(newControls);Public Event Change As EventHandler 重写Protected Overrides Function OnBubbleEvent(ByVal source As Object, ByVal e As System.EventArgs) As Boolean 确定类型If TypeOf e Is CommandEventArgs Then或ce.CommandName确定来源。
    这是对可以CommandEventArgs。按钮类如果是changEventArgs的,文本框什么的,目前情况下不知道怎么做。
    ~~
      

  43.   

    引用一个朋友以前给我的一段代码,对你可能有用吧。
    数据库的处理自己能搞定吧!!道理差不多了。
    加载事件前面都说过了,不再说了
    <script language=C# runat=server>
    int Count
    {
      get
      {
        object o = ViewState["Count"];
        if (o==null)
    return 0;
        return (int)ViewState["Count"];
      }
      set
      {
    ViewState["Count"] = value;
      }
    }DropDownList AddDDL()
    {
      TableRow tr = new TableRow();
      TableCell tc = new TableCell();  DropDownList ddl = new DropDownList();
      tc.Controls.Add(ddl);
      tr.Cells.Add(tc);
      tbl.Rows.Add(tr);  return ddl;
    }void PopulateDLL(DropDownList ddl)
    {
       for (int i=1; i <=10; i++)
    ddl.Items.Add(i.ToString());
    }
    void Page_Load(Object sender, EventArgs e)
    {
       for (int i=0; i < Count; i++)
    {
    AddDDL();
    }
    }void Add(Object sender, EventArgs e)
    {
      DropDownList ddl= AddDDL();
      PopulateDLL(ddl);
      Count++;
    }</script><form runat=server id=form1>
    <asp:Table id=tbl runat=server />
    <asp:Button id=btn runat=server text=add Onclick="Add" />
    <asp:Button id=btn2 runat=server text=submit/>
    </form>
      

  44.   

    其实这个问题很简单的。看看用户控件的动态加载就知道了。实际上每次的页面加载所有的控件都重新生成了一遍,只是使用回传的视图来更新创建的控件的状态。
        动态加载的话,就必须保证每次页面pageload的时候也必须创建该控件。我开始做动态加载用户控件也遇到了这个问题。
      

  45.   

    其实这个问题很简单的。看看用户控件的动态加载就知道了。实际上每次的页面加载所有的控件都重新生成了一遍,只是使用回传的视图来更新创建的控件的状态。
        动态加载的话,就必须保证每次页面pageload的时候也必须创建该控件。我开始做动态加载用户控件也遇到了这个问题。
    应该在Init中创建,因为在Init之后就会加载ViewState,在Page_Load中还原则丢掉了ViewState。
      

  46.   

    你在Page_load里写这段代码!不要放到If(!Page.IsPostback)里
    加事件TextBox1.OntextChanged+=new new EventHandler(你的代理函数);
      

  47.   

    个人感觉,只能是采用HTML控件,而不能采用服务器控件,然后,在后台通过REQUEST.FORM来取得你的控件的值(它往往是一个集合)