动态控件,编码生成过程,神秘的Container变量

这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在

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>

<script language=javascript> function ShowAutoCode() { var e = document.getElementById("dvAutoCode"); if (e.style.display == "") e.style.display = "none"; else e.style.display = ""; } </script>

把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx,你将看到编译错误,按 ,你将看到:


参看加亮的编码句子。

去除那个注释,然后请求该页,你在C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files下能找到一个cs文件,内含同样的编码,注意要加

<%@ Page Debug="true" %>

是否曾经疑惑过DataGrid模板里的 Container是什么玩意?哪里也找不到它的定义?看看上面加亮的编码,原来它是个局部变量名!

System.Web.UI.WebControls.DataGridItem Container;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值