让PAGE_LOAD中的产成控件的程序,每次都能被执行,即不要把创建文本框的语句写在not ispostback中

解决方案 »

  1.   

    你每次都重新生成一个,当然不能保持视图状态了,判断一下,只在第一次生成,
    if (!IsPostBack)
    ...
      

  2.   

    建议你在后台动态添加控件时不要写在if(!IsPostBack)中........
      

  3.   

    动态控件必须在每次访问页面时添加,且在Page.Init事件中,这是msdn上的标准资料。
      

  4.   

    动态控件和视图状态
    在运行时动态创建控件时,控件的某些信息存储在随页呈现的视图状态中。但在将页回发到服务器时,先在 Page.Init 事件中实例化非动态控件(在页上定义)并加载视图状态信息,然后才能重新创建(通常在 Page_Load 处理程序中)动态控件。因此在动态控件创建之前,视图状态将暂时不与页的控件同步。在运行 Page_Load 事件之后,调用控件事件处理方法之前,将保持的视图状态信息加载到动态创建的控件中。多数情况下,此视图状态处理模型都可以很好地工作。通常您将动态控件添加到容器的控件集合的末尾。因此,为动态控件存储的视图状态信息成为相应容器的视图状态结构末端的附加信息,并且页可以在控件创建之前忽略它。但是,动态创建的控件的视图状态信息将在两种情况下会出问题: 如果您在现有控件之间插入动态控件。 
    如果您动态插入控件,并随后在往返期间使用不同的值重新插入它们。 
    如果在现有控件之间插入动态控件,该动态控件的视图状态信息将插入到视图状态结构的相应位置。在发送页并加载视图状态时,动态控件还不存在;因此,视图状态中的附加信息将不会对应于正确的控件。结果通常是出现表明存在无效强制转换的错误。如果您在每次往返期间重新插入,则每次动态创建的控件都将从上述控件集的视图状态中选取属性值。在很多情况下,可以通过将容器控件的 EnableViewState 属性设置为 false 来避免此问题。
      

  5.   

    这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在if (!IsPostBack)
    {
            //动态产生或装载控件
            //也许需要连接控件事件处理函数
           //加到父控件的Controls
    }里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if (!IsPostBack)之外做。我问为什么想在if (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样<form id="form1" runat=server>
    <asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>#%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用Button btn = new Button();需要触发它的Click事件,你需要用btn.Click += new EventHandler(YourHandler);即使象包含<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊不信?加一个页面,TestControls.aspx:<%@ Page Debug="true" %>
    <%@ Import Namespace="System.Data"%>
    <%@ Import Namespace="System.Data.SqlClient"%><form id="form1" runat=server>
    <asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
    <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="false" GridLines="Both">
    <Columns>
     <asp:TemplateColumn HeaderText="Name">
     <ItemTemplate><%# DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>
     </asp:TemplateColumn>
    </Columns>
    </asp:DataGrid>
    </form>
    <script language="C#" runat="server">
    void Button_Click(Object sender, EventArgs e)
    {
      Button btn = (Button)sender;
      Response.Write(btn.Text + " is clicked<BR>");
    }void Page_Load(Object sender, EventArgs e)
    {
       
     Button btn = new Button();
     btn.ID = "Button2";
     btn.Text = "Button2";
     btn.Click += new EventHandler(Button_Click);
     form1.Controls.Add(btn);
       if (!IsPostBack)
       {
     SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;");
     DataTable dt = new DataTable();
     da.Fill(dt);
     DataGrid1.DataSource = dt.DefaultView;
     DataGrid1.DataBind();
       }
     
    //}//这是故意的</script>把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx,你将看到编译错误,
      

  6.   

    问题并不是楼上所说无法触发事件,而是viewstate的处理有问题。看来viewsatae也不是万金油。
      

  7.   

    不是viewstate的问题,是什么问题自己再找找吧
      

  8.   

    讲一句废话,web控件的实现原理还是要好好捉摸的
      

  9.   

    asp.net的事件模型是建立在viewstate基础上的,如果每次都重建控件的话,那么其viewstate值没有变化,那么自然也无法触发你的动态创建控件的事件了
      

  10.   

    如果在现有控件之间插入动态控件,该动态控件的视图状态信息将插入到视图状态结构的相应位置。在发送页并加载视图状态时,动态控件还不存在;因此,视图状态中的附加信息将不会对应于正确的控件。结果通常是出现表明存在无效强制转换的错误。---------------------------------
    JackWu(JackWu):能不能再说说这个问题怎么解决,或者提供一些资料啊!