if (adapterInternal.LoadPostData(str2, values2)) 
{ 
this._changedPostDataConsumers.Add(control2); 
} 
这个方法,这里第二次调用ProcessPostData方法主要就就是处理动态创建控件的事件问题。
这里我们再来看看RaiseChangedEvents方法吧:
复制代码 代码如下:
internal void RaiseChangedEvents() 
{ 
if (this._changedPostDataConsumers != null) 
{ 
for (int i = 0; i < this._changedPostDataConsumers.Count; i++) 
{ 
Control control = (Control) this._changedPostDataConsumers[i]; 
if (control != null) 
{ 
IPostBackDataHandler postBackDataHandler = control.PostBackDataHandler; 
if (((control == null) || control.IsDescendentOf(this)) && ((control != null) && (control.PostBackDataHandler != null))) 
{ 
postBackDataHandler.RaisePostDataChangedEvent(); 
} 
} 
} 
} 
} 
我想到这里TextBox的TextChanged事件的执行你应该很清楚了吧。而RaisePostBackEvent方法就不说,看代码大家都会明白的,
复制代码 代码如下:
private void RaisePostBackEvent(NameValueCollection postData) 
{ 
if (this._registeredControlThatRequireRaiseEvent != null) 
{ 
this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null); 
} 
else 
{ 
string str = postData["__EVENTTARGET"]; 
bool flag = !string.IsNullOrEmpty(str); 
if (flag || (this.AutoPostBackControl != null)) 
{ 
Control control = null; 
if (flag) 
{ 
control = this.FindControl(str); 
} 
if ((control != null) && (control.PostBackEventHandler != null)) 
{ 
string eventArgument = postData["__EVENTARGUMENT"]; 
this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument); 
} 
} 
else 
{ 
this.Validate(); 
} 
} 
}
到这里我们在回忆一下,一般控件的状态信息保存是通过SaveAllState方法,而加载状态信息是在InitComplete之后、PreLoad之前的LoadAllState方法,加载的数据就是上次请求SaveAllState方 法保存的数据,加载状态后调用ProcessPostData方法来处理post过来的数据,动态添加的控件在第二次及后面每次请求添加时都会加载状态数 据,说直接一点是动态添加的控件在添加的时候就加载它的状态数据。在 Load之后、 LoadComplete之前就是我们处理控件的事件调用问题,这里我们再次调用ProcessPostData用来处理动态创建的控件与post过来的 数据,之后分别调用RaiseChangedEvents、RaisePostBackEvent方法拉起处理 IPostBackDataHandler、IPostBackEventHandler中的事件调用。
您可能感兴趣的文章:
