您的位置:首页 > 大数据 > 人工智能

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

2004-11-12 09:29 633 查看
这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在

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,你将看到编译错误,按 ,你将看到:

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;u
4000
id=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:
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:
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:
Line 191:              System.Web.UI.DataBoundLiteralControl target;
Line 192:              target = ((System.Web.UI.DataBoundLiteralControl)(sender));
Line 193:
Line 194:
Line 195:              #line 10 "E:/labs/aspnet/TestControls.aspx"
Line 196:
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息