这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在
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>
void Button_Click(Object sender, EventArgs e)
{
Button btn = (Button)sender;
Response.Write(btn.Text + ” is clicked
“);
}
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();
}
//}//这是故意的
function ShowAutoCode()
{
var e = document.getElementById(“dvAutoCode”);
if (e.style.display == “”) e.style.display = “none”;
else e.style.display = “”;
}
把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx,你将看到编译错误,按 ,你将看到:
Line 1: //------------------------------------------------------------------------------ Line 2: // Line 3: // This code was generated by a tool. Line 4: // Runtime Version: 1.1.4322.573 Line 5: // Line 6: // Changes to this file may cause incorrect behavior and will be lost if Line 7: // the code is regenerated. Line 8: // Line 9: //------------------------------------------------------------------------------ Line 10: Line 11: namespace ASP { Line 12: using System; Line 13: using System.Collections; Line 14: using System.Collections.Specialized; Line 15: using System.Configuration; Line 16: using System.Text; Line 17: using System.Text.RegularExpressions; Line 18: using System.Web; Line 19: using System.Web.Caching; Line 20: using System.Web.SessionState; Line 21: using System.Web.Security; Line 22: using System.Web.UI; Line 23: using System.Web.UI.WebControls; Line 24: using System.Web.UI.HtmlControls; Line 25: using ASP; Line 26: Line 27: #line 2 "E:\labs\aspnet\TestControls.aspx" Line 28: using System.Data; Line 29: Line 30: #line default Line 31: #line hidden Line 32: Line 33: #line 3 "E:\labs\aspnet\TestControls.aspx" Line 34: using System.Data.SqlClient; Line 35: Line 36: #line default Line 37: #line hidden Line 38: Line 39: Line 40: [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()] Line 41: public class TestControls_aspx : System.Web.UI.Page, System.Web.SessionState.IRequiresSessionState { Line 42: Line 43: private static int __autoHandlers; Line 44: Line 45: Line 46: #line 6 "E:\labs\aspnet\TestControls.aspx" Line 47: protected System.Web.UI.WebControls.Button Button1; Line 48: Line 49: #line default Line 50: #line hidden Line 51: Line 52: private System.Web.UI.DataBoundLiteralControl __control5; Line 53: Line 54: Line 55: #line 9 "E:\labs\aspnet\TestControls.aspx" Line 56: private System.Web.UI.WebControls.TemplateColumn __control3; Line 57: Line 58: #line default Line 59: #line hidden Line 60: Line 61: Line 62: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 63: private System.Web.UI.WebControls.DataGridColumnCollection __control2; Line 64: Line 65: #line default Line 66: #line hidden Line 67: Line 68: Line 69: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 70: protected System.Web.UI.WebControls.DataGrid DataGrid1; Line 71: Line 72: #line default Line 73: #line hidden Line 74: Line 75: Line 76: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 77: protected System.Web.UI.HtmlControls.HtmlForm form1; Line 78: Line 79: #line default Line 80: #line hidden Line 81: Line 82: private static bool __initialized = false; Line 83: Line 84: private static System.Collections.ArrayList __fileDependencies; Line 85: Line 86: Line 87: #line 15 "E:\labs\aspnet\TestControls.aspx" Line 88: Line 89: void Button_Click(Object sender, EventArgs e) Line 90: { Line 91: Button btn = (Button)sender; Line 92: Response.Write(btn.Text + " is clicked<BR>"); Line 93: } Line 94: Line 95: void Page_Load(Object sender, EventArgs e) Line 96: { Line 97: Line 98: Button btn = new Button(); Line 99: btn.ID = "Button2"; Line 100: btn.Text = "Button2"; Line 101: btn.Click += new EventHandler(Button_Click); Line 102: form1.Controls.Add(btn); Line 103: if (!IsPostBack) Line 104: { Line 105: SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;"); Line 106: DataTable dt = new DataTable(); Line 107: da.Fill(dt); Line 108: DataGrid1.DataSource = dt.DefaultView; Line 109: DataGrid1.DataBind(); Line 110: } Line 111: Line 112: Line 113: //} Line 114: Line 115: Line 116: #line default Line 117: #line hidden Line 118: Line 119: public TestControls_aspx() { Line 120: System.Collections.ArrayList dependencies; Line 121: if ((ASP.TestControls_aspx.__initialized == false)) { Line 122: dependencies = new System.Collections.ArrayList(); Line 123: dependencies.Add("E:\\labs\\aspnet\\TestControls.aspx"); Line 124: ASP.TestControls_aspx.__fileDependencies = dependencies; Line 125: ASP.TestControls_aspx.__initialized = true; Line 126: } Line 127: this.Server.ScriptTimeout = 30000000; Line 128: } Line 129: Line 130: protected override int AutoHandlers { Line 131: get { Line 132: return ASP.TestControls_aspx.__autoHandlers; Line 133: } Line 134: set { Line 135: ASP.TestControls_aspx.__autoHandlers = value; Line 136: } Line 137: } Line 138: Line 139: protected ASP.global_asax ApplicationInstance { Line 140: get { Line 141: return ((ASP.global_asax)(this.Context.ApplicationInstance)); Line 142: } Line 143: } Line 144: Line 145: public override string TemplateSourceDirectory { Line 146: get { Line 147: return "/labs/aspnet"; Line 148: } Line 149: } Line 150: Line 151: private System.Web.UI.Control __BuildControlButton1() { Line 152: System.Web.UI.WebControls.Button __ctrl; Line 153: Line 154: #line 6 "E:\labs\aspnet\TestControls.aspx" Line 155: __ctrl = new System.Web.UI.WebControls.Button(); Line 156: Line 157: #line default Line 158: #line hidden Line 159: this.Button1 = __ctrl; Line 160: Line 161: #line 6 "E:\labs\aspnet\TestControls.aspx" Line 162: __ctrl.ID = "Button1"; Line 163: Line 164: #line default Line 165: #line hidden Line 166: Line 167: #line 6 "E:\labs\aspnet\TestControls.aspx" Line 168: __ctrl.Text = "Button1"; Line 169: Line 170: #line default Line 171: #line hidden Line 172: Line 173: #line 6 "E:\labs\aspnet\TestControls.aspx" Line 174: __ctrl.Click += new System.EventHandler(this.Button_Click); Line 175: Line 176: #line default Line 177: #line hidden Line 178: return __ctrl; Line 179: } Line 180: Line 181: private System.Web.UI.Control __BuildControl__control5() { Line 182: System.Web.UI.DataBoundLiteralControl __ctrl; Line 183: __ctrl = new System.Web.UI.DataBoundLiteralControl(1, 1); Line 184: this.__control5 = __ctrl; Line 185: __ctrl.DataBinding += new System.EventHandler(this.__DataBind__control5); Line 186: return __ctrl; Line 187: } Line 188: Line 189: public void __DataBind__control5(object sender, System.EventArgs e) { Line 190: System.Web.UI.WebControls.DataGridItem Container; Line 191: System.Web.UI.DataBoundLiteralControl target; Line 192: target = ((System.Web.UI.DataBoundLiteralControl)(sender)); Line 193: Container = ((System.Web.UI.WebControls.DataGridItem)(target.BindingContainer)); Line 194: Line 195: #line 10 "E:\labs\aspnet\TestControls.aspx" Line 196: target.SetDataBoundString(0, System.Convert.ToString(DataBinder.Eval(Container.DataItem,"Name"))); Line 197: Line 198: #line default Line 199: #line hidden Line 200: } Line 201: Line 202: private void __BuildControl__control4(System.Web.UI.Control __ctrl) { Line 203: Line 204: #line 9 "E:\labs\aspnet\TestControls.aspx" Line 205: this.__BuildControl__control5(); Line 206: Line 207: #line default Line 208: #line hidden Line 209: System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl)); Line 210: Line 211: #line 9 "E:\labs\aspnet\TestControls.aspx" Line 212: __parser.AddParsedSubObject(this.__control5); Line 213: Line 214: #line default Line 215: #line hidden Line 216: } Line 217: Line 218: private void __BuildControl__control3() { Line 219: System.Web.UI.WebControls.TemplateColumn __ctrl; Line 220: Line 221: #line 9 "E:\labs\aspnet\TestControls.aspx" Line 222: __ctrl = new System.Web.UI.WebControls.TemplateColumn(); Line 223: Line 224: #line default Line 225: #line hidden Line 226: this.__control3 = __ctrl; Line 227: Line 228: #line 9 "E:\labs\aspnet\TestControls.aspx" Line 229: __ctrl.HeaderText = "Name"; Line 230: Line 231: #line default Line 232: #line hidden Line 233: Line 234: #line 9 "E:\labs\aspnet\TestControls.aspx" Line 235: __ctrl.ItemTemplate = new System.Web.UI.CompiledTemplateBuilder(new System.Web.UI.BuildTemplateMethod(this.__BuildControl__control4)); Line 236: Line 237: #line default Line 238: #line hidden Line 239: } Line 240: Line 241: private void __BuildControl__control2(System.Web.UI.WebControls.DataGridColumnCollection __ctrl) { Line 242: Line 243: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 244: this.__BuildControl__control3(); Line 245: Line 246: #line default Line 247: #line hidden Line 248: Line 249: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 250: __ctrl.Add(this.__control3); Line 251: Line 252: #line default Line 253: #line hidden Line 254: } Line 255: Line 256: private System.Web.UI.Control __BuildControlDataGrid1() { Line 257: System.Web.UI.WebControls.DataGrid __ctrl; Line 258: Line 259: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 260: __ctrl = new System.Web.UI.WebControls.DataGrid(); Line 261: Line 262: #line default Line 263: #line hidden Line 264: this.DataGrid1 = __ctrl; Line 265: Line 266: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 267: __ctrl.ID = "DataGrid1"; Line 268: Line 269: #line default Line 270: #line hidden Line 271: Line 272: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 273: __ctrl.AutoGenerateColumns = false; Line 274: Line 275: #line default Line 276: #line hidden Line 277: Line 278: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 279: __ctrl.GridLines = System.Web.UI.WebControls.GridLines.Both; Line 280: Line 281: #line default Line 282: #line hidden Line 283: Line 284: #line 7 "E:\labs\aspnet\TestControls.aspx" Line 285: this.__BuildControl__control2(__ctrl.Columns); Line 286: Line 287: #line default Line 288: #line hidden Line 289: return __ctrl; Line 290: } Line 291: Line 292: private System.Web.UI.Control __BuildControlform1() { Line 293: System.Web.UI.HtmlControls.HtmlForm __ctrl; Line 294: Line 295: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 296: __ctrl = new System.Web.UI.HtmlControls.HtmlForm(); Line 297: Line 298: #line default Line 299: #line hidden Line 300: this.form1 = __ctrl; Line 301: Line 302: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 303: __ctrl.ID = "form1"; Line 304: Line 305: #line default Line 306: #line hidden Line 307: System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl)); Line 308: Line 309: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 310: __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n")); Line 311: Line 312: #line default Line 313: #line hidden Line 314: Line 315: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 316: this.__BuildControlButton1(); Line 317: Line 318: #line default Line 319: #line hidden Line 320: Line 321: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 322: __parser.AddParsedSubObject(this.Button1); Line 323: Line 324: #line default Line 325: #line hidden Line 326: Line 327: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 328: __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n")); Line 329: Line 330: #line default Line 331: #line hidden Line 332: Line 333: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 334: this.__BuildControlDataGrid1(); Line 335: Line 336: #line default Line 337: #line hidden Line 338: Line 339: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 340: __parser.AddParsedSubObject(this.DataGrid1); Line 341: Line 342: #line default Line 343: #line hidden Line 344: Line 345: #line 5 "E:\labs\aspnet\TestControls.aspx" Line 346: __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n")); Line 347: Line 348: #line default Line 349: #line hidden Line 350: return __ctrl; Line 351: } Line 352: Line 353: private void __BuildControlTree(System.Web.UI.Control __ctrl) { Line 354: Line 355: #line 1 "E:\labs\aspnet\TestControls.aspx" Line 356: this.__BuildControlform1(); Line 357: Line 358: #line default Line 359: #line hidden Line 360: System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl)); Line 361: Line 362: #line 1 "E:\labs\aspnet\TestControls.aspx" Line 363: __parser.AddParsedSubObject(this.form1); Line 364: Line 365: #line default Line 366: #line hidden Line 367: Line 368: #line 1 "E:\labs\aspnet\TestControls.aspx" Line 369: __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n")); Line 370: Line 371: #line default Line 372: #line hidden Line 373: } Line 374: Line 375: protected override void FrameworkInitialize() { Line 376: this.__BuildControlTree(this); Line 377: this.FileDependencies = ASP.TestControls_aspx.__fileDependencies; Line 378: this.EnableViewStateMac = true; Line 379: this.Request.ValidateInput(); Line 380: } Line 381: Line 382: public override int GetTypeHashCode() { Line 383: return 2057729977; Line 384: } Line 385: } Line 386: } Line 387:
参看加亮的编码句子。
去除那个注释,然后请求该页,你在C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files下能找到一个cs文件,内含同样的编码,注意要加
<%@ Page Debug=”true” %>
是否曾经疑惑过DataGrid模板里的Container是什么玩意?哪里也找不到它的定义?看看上面加亮的编码,原来它是个局部变量名!
System.Web.UI.WebControls.DataGridItem Container;