想办法看.net的源码吧。。。
- - 劳烦您给指一条明路
@枼秋: 你不是想做跟。net控件差不多的功能么?那就看这个控件的源码啊。用reflector之类的。。。
@顾晓北: 工具下载了,挺好用,我正在找哪个工具箱的类库在哪里呢,还想看看有没有别的意见的。顺便问下晓北兄你知道我要找的类库在哪里么
@枼秋: 自己搜一搜.netframework装在什么文件夹吧。
@顾晓北: - - 我觉得这个能看到的可能性怎么比较低呢。
话说我自己用反射写好了一个方法
private string SwitchToJson<T>(IList<T> li, string Text, string Value) where T : class { //body } //这是我的数据源属性 public Object DataSource{get;set;}
好吧这个
SwitchToJson的方法该怎么调用呢?
//如果我这样写肯定是报错的,类型不一致 //好吧!! 我真心第一次写反射 //这玩意一般怎么写呢 SwitchToJson(DataSource,DataValue,DataText)
@枼秋: 怎么调用?你不是写自定义控件么?当然是在控件里面调用啊。
@顾晓北: 我的意思是我的这个方法需要传进来的参数是List<T>,而我的DataSource是object类型的(传因为这个属性的类型是没有办法确定的,所以选择了object),我怎么把DataSource传进这个方法里面去呢
@枼秋:
// Generated by .NET Reflector from C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll namespace System.Web.UI { using System; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Globalization; using System.IO; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Web; using System.Web.Caching; using System.Web.Configuration; using System.Web.Hosting; using System.Web.UI.Adapters; using System.Web.UI.WebControls; using System.Web.Util; [ToolboxItem("System.Web.UI.Design.WebControlToolboxItem, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), DesignerCategory("Code"), Bindable(true), DefaultProperty("ID"), DesignerSerializer("Microsoft.VisualStudio.Web.WebForms.ControlCodeDomSerializer, Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.ComponentModel.Design.Serialization.CodeDomSerializer, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ToolboxItemFilter("System.Web.UI", ToolboxItemFilterType.Require), Designer("System.Web.UI.Design.ControlDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), Themeable(false), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] public class Control : IComponent, IDisposable, IParserAccessor, IUrlResolutionService, IDataBindingsAccessor, IControlBuilderAccessor, IControlDesignerAccessor, IExpressionsAccessor { internal ControlAdapter _adapter; private string _cachedUniqueID; private System.Web.UI.ControlState _controlState; private string _id; private Control _namingContainer; private OccasionalFields _occasionalFields; internal System.Web.UI.Page _page; private Control _parent; private System.Web.UI.TemplateControl _templateControl; private VirtualPath _templateSourceVirtualDirectory; private StateBag _viewState; private const int automaticIDCount = 0x80; private const string automaticIDPrefix = "ctl"; private static readonly string[] automaticIDs = new string[] { "ctl00", "ctl01", "ctl02", "ctl03", "ctl04", "ctl05", "ctl06", "ctl07", "ctl08", "ctl09", "ctl10", "ctl11", "ctl12", "ctl13", "ctl14", "ctl15", "ctl16", "ctl17", "ctl18", "ctl19", "ctl20", "ctl21", "ctl22", "ctl23", "ctl24", "ctl25", "ctl26", "ctl27", "ctl28", "ctl29", "ctl30", "ctl31", "ctl32", "ctl33", "ctl34", "ctl35", "ctl36", "ctl37", "ctl38", "ctl39", "ctl40", "ctl41", "ctl42", "ctl43", "ctl44", "ctl45", "ctl46", "ctl47", "ctl48", "ctl49", "ctl50", "ctl51", "ctl52", "ctl53", "ctl54", "ctl55", "ctl56", "ctl57", "ctl58", "ctl59", "ctl60", "ctl61", "ctl62", "ctl63", "ctl64", "ctl65", "ctl66", "ctl67", "ctl68", "ctl69", "ctl70", "ctl71", "ctl72", "ctl73", "ctl74", "ctl75", "ctl76", "ctl77", "ctl78", "ctl79", "ctl80", "ctl81", "ctl82", "ctl83", "ctl84", "ctl85", "ctl86", "ctl87", "ctl88", "ctl89", "ctl90", "ctl91", "ctl92", "ctl93", "ctl94", "ctl95", "ctl96", "ctl97", "ctl98", "ctl99", "ctl100", "ctl101", "ctl102", "ctl103", "ctl104", "ctl105", "ctl106", "ctl107", "ctl108", "ctl109", "ctl110", "ctl111", "ctl112", "ctl113", "ctl114", "ctl115", "ctl116", "ctl117", "ctl118", "ctl119", "ctl120", "ctl121", "ctl122", "ctl123", "ctl124", "ctl125", "ctl126", "ctl127" }; private const string automaticLegacyIDPrefix = "_ctl"; private const int controlAdapterResolved = 0x8000; private const int controlsCreated = 8; private const int controlStateApplied = 0x100000; private const int creatingControls = 0x100; private const int designMode = 0x10000; private const int designModeChecked = 0x20000; private const int disableChildControlState = 0x40000; private const int disableTheming = 0x1000; private const int disableViewState = 4; private const int enableThemingSet = 0x2000; internal const bool EnableViewStateDefault = true; internal static readonly object EventDataBinding = new object(); private static readonly object EventDisposed = new object(); internal static readonly object EventInit = new object(); internal static readonly object EventLoad = new object(); internal static readonly object EventPreRender = new object(); internal static readonly object EventUnload = new object(); internal SimpleBitVector32 flags; private const char ID_RENDER_SEPARATOR = '_'; internal const char ID_SEPARATOR = '$'; private const int idNotCalculated = 1; private const int idNotRequired = 0x40; private const int invisible = 0x10; private const int isNamingContainer = 0x80; internal const int isWebControlDisabled = 0x80000; internal const char LEGACY_ID_SEPARATOR = ':'; private const int marked = 2; private const int mustRenderID = 0x800; private const int notVisibleOnPage = 0x200; private const int styleSheetApplied = 0x4000; private const int themeApplied = 0x400; private const int useGeneratedID = 0x200000; private const int visibleDirty = 0x20; [WebSysDescription("Control_OnDataBind"), WebCategory("Data")] public event EventHandler DataBinding { add { this.Events.AddHandler(EventDataBinding, value); } remove { this.Events.RemoveHandler(EventDataBinding, value); } } [WebSysDescription("Control_OnDisposed")] public event EventHandler Disposed { add { this.Events.AddHandler(EventDisposed, value); } remove { this.Events.RemoveHandler(EventDisposed, value); } } [WebSysDescription("Control_OnInit")] public event EventHandler Init { add { this.Events.AddHandler(EventInit, value); } remove { this.Events.RemoveHandler(EventInit, value); } } [WebSysDescription("Control_OnLoad")] public event EventHandler Load { add { this.Events.AddHandler(EventLoad, value); } remove { this.Events.RemoveHandler(EventLoad, value); } } [WebSysDescription("Control_OnPreRender")] public event EventHandler PreRender { add { this.Events.AddHandler(EventPreRender, value); } remove { this.Events.RemoveHandler(EventPreRender, value); } } [WebSysDescription("Control_OnUnload")] public event EventHandler Unload { add { this.Events.AddHandler(EventUnload, value); } remove { this.Events.RemoveHandler(EventUnload, value); } } public Control() { if (this is INamingContainer) { this.flags.Set(0x80); } } protected internal virtual void AddedControl(Control control, int index) { if (control.OwnerControl != null) { throw new InvalidOperationException(System.Web.SR.GetString("Substitution_NotAllowed")); } if (control._parent != null) { control._parent.Controls.Remove(control); } control._parent = this; control._page = this.Page; control.flags.Clear(0x20000); Control namingContainer = this.flags[0x80] ? this : this._namingContainer; if (namingContainer != null) { control.UpdateNamingContainer(namingContainer); if ((control._id == null) && !control.flags[0x40]) { control.GenerateAutomaticID(); } else if ((control._id != null) || ((control._occasionalFields != null) && (control._occasionalFields.Controls != null))) { namingContainer.DirtyNameTable(); } } if (this._controlState >= System.Web.UI.ControlState.ChildrenInitialized) { control.InitRecursive(namingContainer); if (((control._controlState >= System.Web.UI.ControlState.Initialized) && (control.RareFields != null)) && control.RareFields.RequiredControlState) { this.Page.RegisterRequiresControlState(control); } if (this._controlState >= System.Web.UI.ControlState.ViewStateLoaded) { object savedState = null; if ((this._occasionalFields != null) && (this._occasionalFields.ControlsViewState != null)) { savedState = this._occasionalFields.ControlsViewState[index]; if (this.LoadViewStateByID) { control.EnsureID(); savedState = this._occasionalFields.ControlsViewState[control.ID]; this._occasionalFields.ControlsViewState.Remove(control.ID); } else { savedState = this._occasionalFields.ControlsViewState[index]; this._occasionalFields.ControlsViewState.Remove(index); } } control.LoadViewStateRecursive(savedState); if (this._controlState >= System.Web.UI.ControlState.Loaded) { control.LoadRecursive(); if (this._controlState >= System.Web.UI.ControlState.PreRendered) { control.PreRenderRecursiveInternal(); } } } } } protected virtual void AddParsedSubObject(object obj) { Control child = obj as Control; if (child != null) { this.Controls.Add(child); } } private void ApplySkin(System.Web.UI.Page page) { if (page == null) { throw new ArgumentNullException("page"); } if (!this.flags[0x400] && ThemeableAttribute.IsTypeThemeable(base.GetType())) { page.ApplyControlSkin(this); this.flags.Set(0x400); } } [EditorBrowsable(EditorBrowsableState.Advanced)] public virtual void ApplyStyleSheetSkin(System.Web.UI.Page page) { if (page != null) { if (this.flags[0x4000]) { throw new InvalidOperationException(System.Web.SR.GetString("StyleSheetAreadyAppliedOnControl")); } if (page.ApplyControlStyleSheet(this)) { this.flags.Set(0x4000); } } } protected void BuildProfileTree(string parentId, bool calcViewState) { int num; calcViewState = calcViewState && !this.flags[4]; if (calcViewState) { num = this.EstimateStateSize(this.SaveViewState()); } else { num = 0; } int controlStateSize = 0; if (((this.Page != null) && (this.Page._registeredControlsRequiringControlState != null)) && this.Page._registeredControlsRequiringControlState.Contains(this)) { controlStateSize = this.EstimateStateSize(this.SaveControlStateInternal()); } this.Page.Trace.AddNewControl(this.UniqueID, parentId, base.GetType().FullName, num, controlStateSize); if ((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) { int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { this._occasionalFields.Controls[i].BuildProfileTree(this.UniqueID, calcViewState); } } } private void ClearCachedUniqueIDRecursive() { this._cachedUniqueID = null; if (this._occasionalFields != null) { this._occasionalFields.UniqueIDPrefix = null; if (this._occasionalFields.Controls != null) { int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { this._occasionalFields.Controls[i].ClearCachedUniqueIDRecursive(); } } } } protected void ClearChildControlState() { if (this.ControlState >= System.Web.UI.ControlState.Initialized) { this.flags.Set(0x40000); if (this.Page != null) { this.Page.RegisterRequiresClearChildControlState(this); } } } protected void ClearChildState() { this.ClearChildControlState(); this.ClearChildViewState(); } protected void ClearChildViewState() { if (this._occasionalFields != null) { this._occasionalFields.ControlsViewState = null; } } internal void ClearNamingContainer() { this.EnsureOccasionalFields(); this._occasionalFields.NamedControlsID = 0; this.DirtyNameTable(); } protected internal virtual void CreateChildControls() { } protected virtual ControlCollection CreateControlCollection() { return new ControlCollection(this); } public virtual void DataBind() { this.DataBind(true); } protected virtual void DataBind(bool raiseOnDataBinding) { bool flag = false; if (this.IsBindingContainer) { bool flag2; object dataItem = DataBinder.GetDataItem(this, out flag2); if (flag2 && (this.Page != null)) { this.Page.PushDataBindingContext(dataItem); flag = true; } } try { if (raiseOnDataBinding) { this.OnDataBinding(EventArgs.Empty); } this.DataBindChildren(); } finally { if (flag) { this.Page.PopDataBindingContext(); } } } protected virtual void DataBindChildren() { if (this.HasControls()) { this.EnsureOccasionalFields(); string errorMsg = this._occasionalFields.Controls.SetCollectionReadOnly("Parent_collections_readonly"); try { try { int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { this._occasionalFields.Controls[i].DataBind(); } } finally { this._occasionalFields.Controls.SetCollectionReadOnly(errorMsg); } } catch { throw; } } } internal void DirtyNameTable() { if (this._occasionalFields != null) { this._occasionalFields.NamedControls = null; } } public virtual void Dispose() { IContainer service = null; if (this.Site != null) { service = (IContainer) this.Site.GetService(typeof(IContainer)); if (service != null) { service.Remove(this); EventHandler handler = this.Events[EventDisposed] as EventHandler; if (handler != null) { handler(this, EventArgs.Empty); } } } if (this._occasionalFields != null) { this._occasionalFields.Dispose(); } } protected virtual void EnsureChildControls() { if (!this.ChildControlsCreated && !this.flags[0x100]) { this.flags.Set(0x100); try { this.ResolveAdapter(); if (this._adapter != null) { this._adapter.CreateChildControls(); } else { this.CreateChildControls(); } this.ChildControlsCreated = true; } finally { this.flags.Clear(0x100); } } } protected void EnsureID() { if (this._namingContainer != null) { if (this._id == null) { this.GenerateAutomaticID(); } this.flags.Set(0x800); } } private void EnsureNamedControlsTable() { this._occasionalFields.NamedControls = new HybridDictionary(this._occasionalFields.NamedControlsID, true); this.FillNamedControlsTable(this, this._occasionalFields.Controls); } private void EnsureOccasionalFields() { if (this._occasionalFields == null) { this._occasionalFields = new OccasionalFields(); } } internal int EstimateStateSize(object state) { if (state == null) { return 0; } return Util.SerializeWithAssert(new ObjectStateFormatter(), state).Length; } private void FillNamedControlsTable(Control namingContainer, ControlCollection controls) { int count = controls.Count; for (int i = 0; i < count; i++) { Control control = controls[i]; if (control._id != null) { try { namingContainer.EnsureOccasionalFields(); namingContainer._occasionalFields.NamedControls.Add(control._id, control); } catch { throw new HttpException(System.Web.SR.GetString("Duplicate_id_used", new object[] { control._id, "FindControl" })); } } if (control.HasControls() && !control.flags[0x80]) { this.FillNamedControlsTable(namingContainer, control.Controls); } } } public virtual Control FindControl(string id) { return this.FindControl(id, 0); } protected virtual Control FindControl(string id, int pathOffset) { string str; this.EnsureChildControls(); if (!this.flags[0x80]) { Control namingContainer = this.NamingContainer; if (namingContainer != null) { return namingContainer.FindControl(id, pathOffset); } return null; } if (this.HasControls() && (this._occasionalFields.NamedControls == null)) { this.EnsureNamedControlsTable(); } if ((this._occasionalFields == null) || (this._occasionalFields.NamedControls == null)) { return null; } char[] anyOf = new char[] { '$', ':' }; int num = id.IndexOfAny(anyOf, pathOffset); if (num == -1) { str = id.Substring(pathOffset); return (this._occasionalFields.NamedControls[str] as Control); } str = id.Substring(pathOffset, num - pathOffset); Control control2 = this._occasionalFields.NamedControls[str] as Control; if (control2 == null) { return null; } return control2.FindControl(id, num + 1); } public virtual void Focus() { this.Page.SetFocus(this); } private void GenerateAutomaticID() { this.flags.Set(0x200000); this._namingContainer.EnsureOccasionalFields(); int index = this._namingContainer._occasionalFields.NamedControlsID++; if (this.EnableLegacyRendering) { this._id = "_ctl" + index.ToString(NumberFormatInfo.InvariantInfo); } else if (index < 0x80) { this._id = automaticIDs[index]; } else { this._id = "ctl" + index.ToString(NumberFormatInfo.InvariantInfo); } this._namingContainer.DirtyNameTable(); } [SecurityPermission(SecurityAction.Demand, Unrestricted=true)] protected virtual IDictionary GetDesignModeState() { ControlRareFields rareFieldsEnsured = this.RareFieldsEnsured; if (rareFieldsEnsured.DesignModeState == null) { rareFieldsEnsured.DesignModeState = new HybridDictionary(); } return rareFieldsEnsured.DesignModeState; } internal virtual System.Web.UI.TemplateControl GetTemplateControl() { if ((this._templateControl == null) && (this.Parent != null)) { this._templateControl = this.Parent.GetTemplateControl(); } return this._templateControl; } internal virtual string GetUniqueIDPrefix() { this.EnsureOccasionalFields(); if (this._occasionalFields.UniqueIDPrefix == null) { string uniqueID = this.UniqueID; if (!string.IsNullOrEmpty(uniqueID)) { this._occasionalFields.UniqueIDPrefix = uniqueID + this.IdSeparator; } else { this._occasionalFields.UniqueIDPrefix = string.Empty; } } return this._occasionalFields.UniqueIDPrefix; } internal XhtmlConformanceSection GetXhtmlConformanceSection() { HttpContext context = this.Context; if (context != null) { return RuntimeConfig.GetConfig(context).XhtmlConformance; } return RuntimeConfig.GetConfig().XhtmlConformance; } public virtual bool HasControls() { return (((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) && (this._occasionalFields.Controls.Count > 0)); } protected bool HasEvents() { return ((this._occasionalFields != null) && (this._occasionalFields.Events != null)); } internal bool HasRenderDelegate() { return ((this.RareFields != null) && (this.RareFields.RenderMethod != null)); } internal bool HasRenderingData() { if (!this.HasControls()) { return this.HasRenderDelegate(); } return true; } internal virtual void InitRecursive(Control namingContainer) { this.ResolveAdapter(); if ((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) { if (this.flags[0x80]) { namingContainer = this; } string errorMsg = this._occasionalFields.Controls.SetCollectionReadOnly("Parent_collections_readonly"); int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { Control control = this._occasionalFields.Controls[i]; control.UpdateNamingContainer(namingContainer); if (((control._id == null) && (namingContainer != null)) && !control.flags[0x40]) { control.GenerateAutomaticID(); } control._page = this.Page; control.InitRecursive(namingContainer); } this._occasionalFields.Controls.SetCollectionReadOnly(errorMsg); } if (this._controlState < System.Web.UI.ControlState.Initialized) { this._controlState = System.Web.UI.ControlState.ChildrenInitialized; if (((this.Page != null) && !this.DesignMode) && (this.Page.ContainsTheme && this.EnableTheming)) { this.ApplySkin(this.Page); } if (this._adapter != null) { this._adapter.OnInit(EventArgs.Empty); } else { this.OnInit(EventArgs.Empty); } this._controlState = System.Web.UI.ControlState.Initialized; } this.TrackViewState(); } internal bool IsDescendentOf(Control ancestor) { Control parent = this; while ((parent != ancestor) && (parent.Parent != null)) { parent = parent.Parent; } return (parent == ancestor); } protected bool IsLiteralContent() { return ((((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) && (this._occasionalFields.Controls.Count == 1)) && (this._occasionalFields.Controls[0] is LiteralControl)); } internal void LoadChildViewStateByID(ArrayList childState) { int count = childState.Count; for (int i = 0; i < count; i += 2) { string id = (string) childState[i]; object savedState = childState[i + 1]; Control control = this.FindControl(id); if (control != null) { control.LoadViewStateRecursive(savedState); } else { this.EnsureOccasionalFields(); if (this._occasionalFields.ControlsViewState == null) { this._occasionalFields.ControlsViewState = new Hashtable(); } this._occasionalFields.ControlsViewState[id] = savedState; } } } internal void LoadChildViewStateByIndex(ArrayList childState) { ControlCollection controls = this.Controls; int count = controls.Count; int num2 = childState.Count; for (int i = 0; i < num2; i += 2) { int num4 = (int) childState[i]; object savedState = childState[i + 1]; if (num4 < count) { controls[num4].LoadViewStateRecursive(savedState); } else { this.EnsureOccasionalFields(); if (this._occasionalFields.ControlsViewState == null) { this._occasionalFields.ControlsViewState = new Hashtable(); } this._occasionalFields.ControlsViewState[num4] = savedState; } } } protected internal virtual void LoadControlState(object savedState) { } internal void LoadControlStateInternal(object savedStateObj) { if (!this.flags[0x100000]) { this.flags.Set(0x100000); Pair pair = (Pair) savedStateObj; if (pair != null) { System.Web.UI.Page page = this.Page; if ((page == null) || page.ShouldLoadControlState(this)) { if (pair.First != null) { this.LoadControlState(pair.First); } if ((this._adapter != null) && (pair.Second != null)) { this._adapter.LoadAdapterControlState(pair.Second); } } } } } internal virtual void LoadRecursive() { if (this._controlState < System.Web.UI.ControlState.Loaded) { if (this._adapter != null) { this._adapter.OnLoad(EventArgs.Empty); } else { this.OnLoad(EventArgs.Empty); } } if ((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) { string errorMsg = this._occasionalFields.Controls.SetCollectionReadOnly("Parent_collections_readonly"); int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { this._occasionalFields.Controls[i].LoadRecursive(); } this._occasionalFields.Controls.SetCollectionReadOnly(errorMsg); } if (this._controlState < System.Web.UI.ControlState.Loaded) { this._controlState = System.Web.UI.ControlState.Loaded; } } protected virtual void LoadViewState(object savedState) { if (savedState != null) { this.ViewState.LoadViewState(savedState); object obj2 = this.ViewState["Visible"]; if (obj2 != null) { if (!((bool) obj2)) { this.flags.Set(0x10); } else { this.flags.Clear(0x10); } this.flags.Set(0x20); } } } internal void LoadViewStateRecursive(object savedState) { if ((savedState != null) && !this.flags[4]) { if ((this.Page != null) && this.Page.IsPostBack) { object first = null; object state = null; ArrayList childState = null; Pair pair = savedState as Pair; if (pair != null) { first = pair.First; childState = (ArrayList) pair.Second; } else { Triplet triplet = (Triplet) savedState; first = triplet.First; state = triplet.Second; childState = (ArrayList) triplet.Third; } try { if ((state != null) && (this._adapter != null)) { this._adapter.LoadAdapterViewState(state); } if (first != null) { this.LoadViewState(first); } if (childState != null) { if (this.LoadViewStateByID) { this.LoadChildViewStateByID(childState); } else { this.LoadChildViewStateByIndex(childState); } } } catch (InvalidCastException) { throw new HttpException(System.Web.SR.GetString("Controls_Cant_Change_Between_Posts")); } catch (IndexOutOfRangeException) { throw new HttpException(System.Web.SR.GetString("Controls_Cant_Change_Between_Posts")); } } this._controlState = System.Web.UI.ControlState.ViewStateLoaded; } } protected internal string MapPathSecure(string virtualPath) { string str; VirtualPath path; if (string.IsNullOrEmpty(virtualPath)) { throw new ArgumentNullException("virtualPath", System.Web.SR.GetString("VirtualPath_Length_Zero")); } this.ResolvePhysicalOrVirtualPath(virtualPath, out path, out str); if (str == null) { str = path.MapPathInternal(this.TemplateControlVirtualDirectory, true); } HttpRuntime.CheckFilePermission(str); return str; } protected virtual bool OnBubbleEvent(object source, EventArgs args) { return false; } protected virtual void OnDataBinding(EventArgs e) { if (this.HasEvents()) { EventHandler handler = this._occasionalFields.Events[EventDataBinding] as EventHandler; if (handler != null) { handler(this, e); } } } protected internal virtual void OnInit(EventArgs e) { if (this.HasEvents()) { EventHandler handler = this._occasionalFields.Events[EventInit] as EventHandler; if (handler != null) { handler(this, e); } } } protected internal virtual void OnLoad(EventArgs e) { if (this.HasEvents()) { EventHandler handler = this._occasionalFields.Events[EventLoad] as EventHandler; if (handler != null) { handler(this, e); } } } protected internal virtual void OnPreRender(EventArgs e) { if (this.HasEvents()) { EventHandler handler = this._occasionalFields.Events[EventPreRender] as EventHandler; if (handler != null) { handler(this, e); } } } protected internal virtual void OnUnload(EventArgs e) { if (this.HasEvents()) { EventHandler handler = this._occasionalFields.Events[EventUnload] as EventHandler; if (handler != null) { handler(this, e); } } } protected internal Stream OpenFile(string path) { string physicalPath = null; VirtualFile file = null; path = path.Trim(); if (UrlPath.IsAbsolutePhysicalPath(path)) { physicalPath = path; } else { file = HostingEnvironment.VirtualPathProvider.GetFile(path); MapPathBasedVirtualFile file2 = file as MapPathBasedVirtualFile; if (file2 != null) { physicalPath = file2.PhysicalPath; } } if (physicalPath != null) { HttpRuntime.CheckFilePermission(physicalPath); } if (file != null) { return file.Open(); } return new FileStream(physicalPath, FileMode.Open, FileAccess.Read, FileShare.Read); } internal Stream OpenFileAndGetDependency(VirtualPath virtualPath, string physicalPath, out CacheDependency dependency) { Stream stream; if ((physicalPath == null) && HostingEnvironment.UsingMapPathBasedVirtualPathProvider) { physicalPath = virtualPath.MapPathInternal(this.TemplateControlVirtualDirectory, true); } if (physicalPath != null) { HttpRuntime.CheckFilePermission(physicalPath); stream = new FileStream(physicalPath, FileMode.Open, FileAccess.Read, FileShare.Read); dependency = new CacheDependency(0, physicalPath); return stream; } stream = virtualPath.OpenFile(); dependency = VirtualPathProvider.GetCacheDependency(virtualPath); return stream; } internal virtual void PreRenderRecursiveInternal() { if (!this.Visible) { this.flags.Set(0x10); } else { this.flags.Clear(0x10); this.EnsureChildControls(); if (this._adapter != null) { this._adapter.OnPreRender(EventArgs.Empty); } else { this.OnPreRender(EventArgs.Empty); } if ((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) { string errorMsg = this._occasionalFields.Controls.SetCollectionReadOnly("Parent_collections_readonly"); int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { this._occasionalFields.Controls[i].PreRenderRecursiveInternal(); } this._occasionalFields.Controls.SetCollectionReadOnly(errorMsg); } } this._controlState = System.Web.UI.ControlState.PreRendered; } internal void PreventAutoID() { if (!this.flags[0x80]) { this.flags.Set(0x40); } } protected void RaiseBubbleEvent(object source, EventArgs args) { for (Control control = this.Parent; control != null; control = control.Parent) { if (control.OnBubbleEvent(source, args)) { return; } } } protected internal virtual void RemovedControl(Control control) { if (control.OwnerControl != null) { throw new InvalidOperationException(System.Web.SR.GetString("Substitution_NotAllowed")); } if ((this._namingContainer != null) && (control._id != null)) { this._namingContainer.DirtyNameTable(); } control.UnloadRecursive(false); control._parent = null; control._page = null; control._namingContainer = null; if (!(control is System.Web.UI.TemplateControl)) { control._templateSourceVirtualDirectory = null; } control._templateControl = null; control.flags.Clear(0x800); control.ClearCachedUniqueIDRecursive(); } protected internal virtual void Render(HtmlTextWriter writer) { this.RenderChildren(writer); } protected internal virtual void RenderChildren(HtmlTextWriter writer) { ICollection children = (this._occasionalFields == null) ? null : this._occasionalFields.Controls; this.RenderChildrenInternal(writer, children); } internal void RenderChildrenInternal(HtmlTextWriter writer, ICollection children) { if ((this.RareFields != null) && (this.RareFields.RenderMethod != null)) { writer.BeginRender(); this.RareFields.RenderMethod(writer, this); writer.EndRender(); } else if (children != null) { foreach (Control control in children) { control.RenderControl(writer); } } } public virtual void RenderControl(HtmlTextWriter writer) { this.RenderControl(writer, this.Adapter); } protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter) { if (!this.flags[0x10] && !this.flags[0x200]) { HttpContext context = (this.Page == null) ? null : this.Page._context; if ((context != null) && context.TraceIsEnabled) { int bufferedLength = context.Response.GetBufferedLength(); this.RenderControlInternal(writer, adapter); int num2 = context.Response.GetBufferedLength(); context.Trace.AddControlSize(this.UniqueID, num2 - bufferedLength); } else { this.RenderControlInternal(writer, adapter); } } } private void RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) { if (adapter != null) { adapter.BeginRender(writer); adapter.Render(writer); adapter.EndRender(writer); } else { this.Render(writer); } } private void ResetVisible() { this.Visible = true; } protected virtual ControlAdapter ResolveAdapter() { if (!this.flags[0x8000]) { if (this.DesignMode) { this.flags.Set(0x8000); return null; } HttpContext context = this.Context; if (context != null) { this._adapter = context.Request.Browser.GetAdapter(this); } this.flags.Set(0x8000); } return this._adapter; } public string ResolveClientUrl(string relativeUrl) { if ((this.DesignMode && (this.Page != null)) && (this.Page.Site != null)) { IUrlResolutionService service = (IUrlResolutionService) this.Page.Site.GetService(typeof(IUrlResolutionService)); if (service != null) { return service.ResolveClientUrl(relativeUrl); } } if (relativeUrl == null) { throw new ArgumentNullException("relativeUrl"); } string virtualPathString = VirtualPath.GetVirtualPathString(this.TemplateControlVirtualDirectory); if (string.IsNullOrEmpty(virtualPathString)) { return relativeUrl; } string str2 = this.Context.Request.ClientBaseDir.VirtualPathString; if (!UrlPath.IsAppRelativePath(relativeUrl)) { if (StringUtil.EqualsIgnoreCase(str2, virtualPathString)) { return relativeUrl; } if ((relativeUrl.Length == 0) || !UrlPath.IsRelativeUrl(relativeUrl)) { return relativeUrl; } } string to = UrlPath.Combine(virtualPathString, relativeUrl); return HttpUtility.UrlPathEncode(UrlPath.MakeRelative(UrlPath.AppendSlashToPathIfNeeded(str2), to)); } internal void ResolvePhysicalOrVirtualPath(string path, out VirtualPath virtualPath, out string physicalPath) { if (UrlPath.IsAbsolutePhysicalPath(path)) { physicalPath = path; virtualPath = null; } else { physicalPath = null; virtualPath = this.TemplateControlVirtualDirectory.Combine(VirtualPath.Create(path)); } } public string ResolveUrl(string relativeUrl) { if (relativeUrl == null) { throw new ArgumentNullException("relativeUrl"); } if ((relativeUrl.Length == 0) || !UrlPath.IsRelativeUrl(relativeUrl)) { return relativeUrl; } string appRelativeTemplateSourceDirectory = this.AppRelativeTemplateSourceDirectory; if (string.IsNullOrEmpty(appRelativeTemplateSourceDirectory)) { return relativeUrl; } string virtualPath = UrlPath.Combine(appRelativeTemplateSourceDirectory, relativeUrl); return this.Context.Response.ApplyAppPathModifier(virtualPath); } protected internal virtual object SaveControlState() { return null; } internal object SaveControlStateInternal() { object x = this.SaveControlState(); object y = null; if (this._adapter != null) { y = this._adapter.SaveAdapterControlState(); } if ((x == null) && (y == null)) { return null; } return new Pair(x, y); } protected virtual object SaveViewState() { if (this.flags[0x20]) { this.ViewState["Visible"] = !this.flags[0x10]; } if (this._viewState != null) { return this._viewState.SaveViewState(); } return null; } internal object SaveViewStateRecursive() { if (!this.flags[4]) { object y = null; if (this._adapter != null) { y = this._adapter.SaveAdapterViewState(); } object x = this.SaveViewState(); ArrayList z = null; if (this.HasControls()) { ControlCollection controls = this._occasionalFields.Controls; int count = controls.Count; bool loadViewStateByID = this.LoadViewStateByID; for (int i = 0; i < count; i++) { Control control = controls[i]; object obj4 = control.SaveViewStateRecursive(); if (obj4 != null) { if (z == null) { z = new ArrayList(count); } if (loadViewStateByID) { control.EnsureID(); z.Add(control.ID); } else { z.Add(i); } z.Add(obj4); } } } if (this._adapter != null) { if (((x != null) || (y != null)) || (z != null)) { return new Triplet(x, y, z); } } else if ((x != null) || (z != null)) { return new Pair(x, z); } } return null; } internal void SetControlBuilder(ControlBuilder controlBuilder) { this.RareFieldsEnsured.ControlBuilder = controlBuilder; } internal void SetDesignMode() { this.flags.Set(0x10000); this.flags.Set(0x20000); } protected virtual void SetDesignModeState(IDictionary data) { } internal void SetEnableViewStateInternal(bool value) { if (!value) { this.flags.Set(4); } else { this.flags.Clear(4); } } [EditorBrowsable(EditorBrowsableState.Advanced)] public void SetRenderMethodDelegate(RenderMethod renderMethod) { this.RareFieldsEnsured.RenderMethod = renderMethod; this.Controls.SetCollectionReadOnly("Collection_readonly_Codeblocks"); } internal bool ShouldSerializeEnableTheming() { return this.flags[0x2000]; } private bool ShouldSerializeVisible() { return this.flags[0x10]; } IDictionary IControlDesignerAccessor.GetDesignModeState() { return this.GetDesignModeState(); } void IControlDesignerAccessor.SetDesignModeState(IDictionary data) { this.SetDesignModeState(data); } void IControlDesignerAccessor.SetOwnerControl(Control owner) { if (owner == this) { throw new ArgumentException(System.Web.SR.GetString("Control_CannotOwnSelf"), "owner"); } this.OwnerControl = owner; this._parent = owner.Parent; this._page = owner.Page; } void IParserAccessor.AddParsedSubObject(object obj) { this.AddParsedSubObject(obj); } protected virtual void TrackViewState() { if (this._viewState != null) { this._viewState.TrackViewState(); } this.flags.Set(2); } internal virtual void UnloadRecursive(bool dispose) { System.Web.UI.Page page = this.Page; if ((page != null) && page.RequiresControlState(this)) { page.UnregisterRequiresControlState(this); this.RareFieldsEnsured.RequiredControlState = true; } if (this.flags[0x200000]) { this._id = null; this.flags.Clear(0x200000); } if ((this._occasionalFields != null) && (this._occasionalFields.Controls != null)) { string errorMsg = this._occasionalFields.Controls.SetCollectionReadOnly("Parent_collections_readonly"); int count = this._occasionalFields.Controls.Count; for (int i = 0; i < count; i++) { this._occasionalFields.Controls[i].UnloadRecursive(dispose); } this._occasionalFields.Controls.SetCollectionReadOnly(errorMsg); } if (this._adapter != null) { this._adapter.OnUnload(EventArgs.Empty); } else { this.OnUnload(EventArgs.Empty); } if (dispose) { this.Dispose(); } if (this.IsReloadable) { this._controlState = System.Web.UI.ControlState.Constructed; } } private void UpdateNamingContainer(Control namingContainer) { if ((this._namingContainer != null) && (this._namingContainer != namingContainer)) { this.ClearCachedUniqueIDRecursive(); } this._namingContainer = namingContainer; } internal void ValidateEvent(string uniqueID) { this.ValidateEvent(uniqueID, string.Empty); } internal void ValidateEvent(string uniqueID, string eventArgument) { if ((this.Page != null) && this.SupportsEventValidation) { this.Page.ClientScript.ValidateEvent(uniqueID, eventArgument); } } protected ControlAdapter Adapter { get { if (!this.flags[0x8000]) { this._adapter = this.ResolveAdapter(); this.flags.Set(0x8000); } return this._adapter; } } [EditorBrowsable(EditorBrowsableState.Advanced), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false), WebSysDescription("Control_TemplateSourceDirectory")] public string AppRelativeTemplateSourceDirectory { get { return VirtualPath.GetAppRelativeVirtualPathStringOrEmpty(this.TemplateControlVirtualDirectory); } [EditorBrowsable(EditorBrowsableState.Never)] set { this.TemplateControlVirtualDirectory = VirtualPath.CreateNonRelativeAllowNull(value); } } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), Bindable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Control BindingContainer { get { Control namingContainer = this.NamingContainer; while (namingContainer is INonBindingContainer) { namingContainer = namingContainer.BindingContainer; } return namingContainer; } } protected bool ChildControlsCreated { get { return this.flags[8]; } set { if (!value && this.flags[8]) { this.Controls.Clear(); } if (value) { this.flags.Set(8); } else { this.flags.Clear(8); } } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false), WebSysDescription("Control_ClientID")] public virtual string ClientID { get { this.EnsureID(); string uniqueID = this.UniqueID; if ((uniqueID != null) && (uniqueID.IndexOf(this.IdSeparator) >= 0)) { return uniqueID.Replace(this.IdSeparator, '_'); } return uniqueID; } } protected char ClientIDSeparator { get { return '_'; } } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] protected internal virtual HttpContext Context { get { System.Web.UI.Page page = this.Page; if (page != null) { return page.Context; } return HttpContext.Current; } } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription("Control_Controls")] public virtual ControlCollection Controls { get { if ((this._occasionalFields == null) || (this._occasionalFields.Controls == null)) { this.EnsureOccasionalFields(); this._occasionalFields.Controls = this.CreateControlCollection(); } return this._occasionalFields.Controls; } } internal System.Web.UI.ControlState ControlState { get { return this._controlState; } set { this._controlState = value; } } protected internal bool DesignMode { get { if (!this.flags[0x20000]) { System.Web.UI.Page page = this.Page; if (page != null) { if (page.GetDesignModeInternal()) { this.flags.Set(0x10000); } else { this.flags.Clear(0x10000); } } else if (this.Site != null) { if (this.Site.DesignMode) { this.flags.Set(0x10000); } else { this.flags.Clear(0x10000); } } else if ((this.Parent != null) && this.Parent.DesignMode) { this.flags.Set(0x10000); } this.flags.Set(0x20000); } return this.flags[0x10000]; } } internal bool EnableLegacyRendering { get { System.Web.UI.Page page = this.Page; if (page != null) { return (page.XhtmlConformanceMode == XhtmlConformanceMode.Legacy); } return ((!this.DesignMode && (this.Adapter == null)) && (this.GetXhtmlConformanceSection().Mode == XhtmlConformanceMode.Legacy)); } } [WebCategory("Behavior"), Browsable(false), DefaultValue(true), Themeable(false), WebSysDescription("Control_EnableTheming")] public virtual bool EnableTheming { get { if (!this.flags[0x2000] && (this.Parent != null)) { return this.Parent.EnableTheming; } return !this.flags[0x1000]; } set { if ((this._controlState >= System.Web.UI.ControlState.FrameworkInitialized) && !this.DesignMode) { throw new InvalidOperationException(System.Web.SR.GetString("PropertySetBeforePreInitOrAddToControls", new object[] { "EnableTheming" })); } if (!value) { this.flags.Set(0x1000); } else { this.flags.Clear(0x1000); } this.flags.Set(0x2000); } } [WebSysDescription("Control_MaintainState"), DefaultValue(true), Themeable(false), WebCategory("Behavior")] public virtual bool EnableViewState { get { return !this.flags[4]; } set { this.SetEnableViewStateInternal(value); } } protected EventHandlerList Events { get { this.EnsureOccasionalFields(); if (this._occasionalFields.Events == null) { this._occasionalFields.Events = new EventHandlerList(); } return this._occasionalFields.Events; } } protected bool HasChildViewState { get { return (((this._occasionalFields != null) && (this._occasionalFields.ControlsViewState != null)) && (this._occasionalFields.ControlsViewState.Count > 0)); } } [Filterable(false), WebSysDescription("Control_ID"), ParenthesizePropertyName(true), MergableProperty(false), Themeable(false)] public virtual string ID { get { if (!this.flags[1] && !this.flags[0x800]) { return null; } return this._id; } set { if ((value != null) && (value.Length == 0)) { value = null; } string str = this._id; this._id = value; this.ClearCachedUniqueIDRecursive(); this.flags.Set(1); this.flags.Clear(0x200000); if ((this._namingContainer != null) && (str != null)) { this._namingContainer.DirtyNameTable(); } } } protected char IdSeparator { get { if (this.Page != null) { return this.Page.IdSeparator; } return this.IdSeparatorFromConfig; } } internal char IdSeparatorFromConfig { get { if (!this.EnableLegacyRendering) { return '$'; } return ':'; } } internal bool IsBindingContainer { get { return ((this is INamingContainer) && !(this is INonBindingContainer)); } } protected internal bool IsChildControlStateCleared { get { return this.flags[0x40000]; } } internal bool IsParentedToUpdatePanel { get { for (Control control = this.Parent; control != null; control = control.Parent) { if (control is IUpdatePanel) { return true; } } return false; } } internal virtual bool IsReloadable { get { return false; } } protected bool IsTrackingViewState { get { return this.flags[2]; } } protected internal bool IsViewStateEnabled { get { for (Control control = this; control != null; control = control.Parent) { if (!control.EnableViewState) { return false; } } return true; } } protected bool LoadViewStateByID { get { return ViewStateModeByIdAttribute.IsEnabled(base.GetType()); } } [WebSysDescription("Control_NamingContainer"), Bindable(false), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual Control NamingContainer { get { if ((this._namingContainer == null) && (this.Parent != null)) { if (this.Parent.flags[0x80]) { this._namingContainer = this.Parent; } else { this._namingContainer = this.Parent.NamingContainer; } } return this._namingContainer; } } private Control OwnerControl { get { if (this.RareFields == null) { return null; } return this.RareFields.OwnerControl; } set { this.RareFieldsEnsured.OwnerControl = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false), WebSysDescription("Control_Page"), Bindable(false)] public virtual System.Web.UI.Page Page { get { if ((this._page == null) && (this.Parent != null)) { this._page = this.Parent.Page; } return this._page; } set { if (this.OwnerControl != null) { throw new InvalidOperationException(); } this._page = value; } } [Bindable(false), WebSysDescription("Control_Parent"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false)] public virtual Control Parent { get { return this._parent; } } internal IPostBackDataHandler PostBackDataHandler { get { IPostBackDataHandler handler = this._adapter as IPostBackDataHandler; if (handler != null) { return handler; } return (this as IPostBackDataHandler); } } internal IPostBackEventHandler PostBackEventHandler { get { IPostBackEventHandler handler = this._adapter as IPostBackEventHandler; if (handler != null) { return handler; } return (this as IPostBackEventHandler); } } private ControlRareFields RareFields { get { if (this._occasionalFields != null) { return this._occasionalFields.RareFields; } return null; } } private ControlRareFields RareFieldsEnsured { get { this.EnsureOccasionalFields(); ControlRareFields rareFields = this._occasionalFields.RareFields; if (rareFields == null) { rareFields = new ControlRareFields(); this._occasionalFields.RareFields = rareFields; } return rareFields; } } [WebSysDescription("Control_Site"), EditorBrowsable(EditorBrowsableState.Advanced), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false)] public ISite Site { get { if (this.OwnerControl != null) { return this.OwnerControl.Site; } if (this.RareFields != null) { return this.RareFields.Site; } return null; } set { if (this.OwnerControl != null) { throw new InvalidOperationException(System.Web.SR.GetString("Substitution_SiteNotAllowed")); } this.RareFieldsEnsured.Site = value; this.flags.Clear(0x20000); } } [DefaultValue(""), Browsable(false), WebSysDescription("Control_SkinId"), Filterable(false), WebCategory("Behavior")] public virtual string SkinID { get { if ((this._occasionalFields != null) && (this._occasionalFields.SkinId != null)) { return this._occasionalFields.SkinId; } return string.Empty; } set { if (!this.DesignMode) { if (this.flags[0x4000]) { throw new InvalidOperationException(System.Web.SR.GetString("PropertySetBeforeStyleSheetApplied", new object[] { "SkinId" })); } if (this._controlState >= System.Web.UI.ControlState.FrameworkInitialized) { throw new InvalidOperationException(System.Web.SR.GetString("PropertySetBeforePreInitOrAddToControls", new object[] { "SkinId" })); } } this.EnsureOccasionalFields(); this._occasionalFields.SkinId = value; } } internal string SpacerImageUrl { get { this.EnsureOccasionalFields(); if (this._occasionalFields.SpacerImageUrl == null) { this._occasionalFields.SpacerImageUrl = this.Page.ClientScript.GetWebResourceUrl(typeof(WebControl), "Spacer.gif"); } return this._occasionalFields.SpacerImageUrl; } } private bool SupportsEventValidation { get { return SupportsEventValidationAttribute.SupportsEventValidation(base.GetType()); } } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] ControlBuilder IControlBuilderAccessor.ControlBuilder { get { if (this.RareFields == null) { return null; } return this.RareFields.ControlBuilder; } } IDictionary IControlDesignerAccessor.UserData { get { ControlRareFields rareFieldsEnsured = this.RareFieldsEnsured; if (rareFieldsEnsured.ControlDesignerAccessorUserData == null) { rareFieldsEnsured.ControlDesignerAccessorUserData = new HybridDictionary(); } return rareFieldsEnsured.ControlDesignerAccessorUserData; } } DataBindingCollection IDataBindingsAccessor.DataBindings { get { ControlRareFields rareFieldsEnsured = this.RareFieldsEnsured; if (rareFieldsEnsured.DataBindings == null) { rareFieldsEnsured.DataBindings = new DataBindingCollection(); } return rareFieldsEnsured.DataBindings; } } bool IDataBindingsAccessor.HasDataBindings { get { return (((this.RareFields != null) && (this.RareFields.DataBindings != null)) && (this.RareFields.DataBindings.Count != 0)); } } ExpressionBindingCollection IExpressionsAccessor.Expressions { get { ExpressionBindingCollection expressionBindings = this.RareFieldsEnsured.ExpressionBindings; if (expressionBindings == null) { expressionBindings = new ExpressionBindingCollection(); this.RareFields.ExpressionBindings = expressionBindings; } return expressionBindings; } } bool IExpressionsAccessor.HasExpressions { get { if (this.RareFields == null) { return false; } ExpressionBindingCollection expressionBindings = this.RareFields.ExpressionBindings; return ((expressionBindings != null) && (expressionBindings.Count > 0)); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription("Control_TemplateControl"), Bindable(false), Browsable(false)] public System.Web.UI.TemplateControl TemplateControl { get { return this.GetTemplateControl(); } [EditorBrowsable(EditorBrowsableState.Never)] set { this._templateControl = value; } } internal VirtualPath TemplateControlVirtualDirectory { get { if (this._templateSourceVirtualDirectory == null) { System.Web.UI.TemplateControl templateControl = this.TemplateControl; if (templateControl == null) { HttpContext context = this.Context; if (context != null) { this._templateSourceVirtualDirectory = context.Request.CurrentExecutionFilePathObject.Parent; } return this._templateSourceVirtualDirectory; } if (templateControl != this) { this._templateSourceVirtualDirectory = templateControl.TemplateControlVirtualDirectory; } } return this._templateSourceVirtualDirectory; } set { this._templateSourceVirtualDirectory = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription("Control_TemplateSourceDirectory"), Browsable(false)] public virtual string TemplateSourceDirectory { get { if (this.TemplateControlVirtualDirectory == null) { return string.Empty; } return this.TemplateControlVirtualDirectory.VirtualPathStringNoTrailingSlash; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), Browsable(false), WebSysDescription("Control_UniqueID")] public virtual string UniqueID { get { if (this._cachedUniqueID == null) { Control namingContainer = this.NamingContainer; if (namingContainer == null) { return this._id; } if (this._id == null) { this.GenerateAutomaticID(); } if (this.Page == namingContainer) { this._cachedUniqueID = this._id; } else { string uniqueIDPrefix = namingContainer.GetUniqueIDPrefix(); if (uniqueIDPrefix.Length == 0) { return this._id; } this._cachedUniqueID = uniqueIDPrefix + this._id; } } return this._cachedUniqueID; } } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription("Control_State")] protected virtual StateBag ViewState { get { if (this._viewState == null) { this._viewState = new StateBag(this.ViewStateIgnoresCase); if (this.IsTrackingViewState) { this._viewState.TrackViewState(); } } return this._viewState; } } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] protected virtual bool ViewStateIgnoresCase { get { return false; } } [DefaultValue(true), Bindable(true), WebCategory("Behavior"), WebSysDescription("Control_Visible")] public virtual bool Visible { get { if (this.flags[0x10]) { return false; } if ((this._parent != null) && !this.DesignMode) { return this._parent.Visible; } return true; } set { if (this.flags[2]) { bool flag = !this.flags[0x10]; if (flag != value) { this.flags.Set(0x20); } } if (!value) { this.flags.Set(0x10); } else { this.flags.Clear(0x10); } } } private sealed class ControlRareFields : IDisposable { public System.Web.UI.ControlBuilder ControlBuilder; public IDictionary ControlDesignerAccessorUserData; public DataBindingCollection DataBindings; public IDictionary DesignModeState; public ExpressionBindingCollection ExpressionBindings; public Control OwnerControl; public System.Web.UI.RenderMethod RenderMethod; public bool RequiredControlState; public ISite Site; internal ControlRareFields() { } public void Dispose() { this.ControlBuilder = null; if (this.OwnerControl != null) { this.OwnerControl.Dispose(); } this.ControlDesignerAccessorUserData = null; this.DesignModeState = null; } } private sealed class OccasionalFields : IDisposable { public ControlCollection Controls; public IDictionary ControlsViewState; public EventHandlerList Events; public IDictionary NamedControls; public int NamedControlsID; public Control.ControlRareFields RareFields; public string SkinId; public string SpacerImageUrl; public string UniqueIDPrefix; internal OccasionalFields() { } public void Dispose() { if (this.Events != null) { this.Events.Dispose(); this.Events = null; } if (this.RareFields != null) { this.RareFields.Dispose(); } this.ControlsViewState = null; } } } }
这就是repeater的源码,你自己看看。
@枼秋: 不好意思,贴错了。下面才是repeater的源码。
// Generated by .NET Reflector from C:\Windows\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll namespace System.Web.UI.WebControls { using System; using System.Collections; using System.ComponentModel; using System.Security.Permissions; using System.Web; using System.Web.UI; [DefaultEvent("ItemCommand"), DefaultProperty("DataSource"), ParseChildren(true), PersistChildren(false), Designer("System.Web.UI.Design.WebControls.RepeaterDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public class Repeater : Control, INamingContainer { private DataSourceSelectArguments _arguments; private DataSourceView _currentView; private bool _currentViewIsFromDataSourceID; private bool _currentViewValid; private bool _inited; private bool _pagePreLoadFired; private bool _requiresDataBinding; private bool _throwOnDataPropertyChange; private ITemplate alternatingItemTemplate; private object dataSource; private static readonly object EventItemCommand = new object(); private static readonly object EventItemCreated = new object(); private static readonly object EventItemDataBound = new object(); private ITemplate footerTemplate; private ITemplate headerTemplate; internal const string ItemCountViewStateKey = "_!ItemCount"; private ArrayList itemsArray; private RepeaterItemCollection itemsCollection; private ITemplate itemTemplate; private ITemplate separatorTemplate; [WebCategory("Action"), WebSysDescription("Repeater_OnItemCommand")] public event RepeaterCommandEventHandler ItemCommand { add { base.Events.AddHandler(EventItemCommand, value); } remove { base.Events.RemoveHandler(EventItemCommand, value); } } [WebCategory("Behavior"), WebSysDescription("DataControls_OnItemCreated")] public event RepeaterItemEventHandler ItemCreated { add { base.Events.AddHandler(EventItemCreated, value); } remove { base.Events.RemoveHandler(EventItemCreated, value); } } [WebCategory("Behavior"), WebSysDescription("DataControls_OnItemDataBound")] public event RepeaterItemEventHandler ItemDataBound { add { base.Events.AddHandler(EventItemDataBound, value); } remove { base.Events.RemoveHandler(EventItemDataBound, value); } } private DataSourceView ConnectToDataSourceView() { if (!this._currentViewValid || base.DesignMode) { if ((this._currentView != null) && this._currentViewIsFromDataSourceID) { this._currentView.DataSourceViewChanged -= new EventHandler(this.OnDataSourceViewChanged); } IDataSource source = null; string dataSourceID = this.DataSourceID; if (dataSourceID.Length != 0) { Control control = DataBoundControlHelper.FindControl(this, dataSourceID); if (control == null) { throw new HttpException(System.Web.SR.GetString("DataControl_DataSourceDoesntExist", new object[] { this.ID, dataSourceID })); } source = control as IDataSource; if (source == null) { throw new HttpException(System.Web.SR.GetString("DataControl_DataSourceIDMustBeDataControl", new object[] { this.ID, dataSourceID })); } } if (source == null) { source = new ReadOnlyDataSource(this.DataSource, this.DataMember); } else if (this.DataSource != null) { throw new InvalidOperationException(System.Web.SR.GetString("DataControl_MultipleDataSources", new object[] { this.ID })); } DataSourceView view = source.GetView(this.DataMember); if (view == null) { throw new InvalidOperationException(System.Web.SR.GetString("DataControl_ViewNotFound", new object[] { this.ID })); } this._currentViewIsFromDataSourceID = this.IsBoundUsingDataSourceID; this._currentView = view; if ((this._currentView != null) && this._currentViewIsFromDataSourceID) { this._currentView.DataSourceViewChanged += new EventHandler(this.OnDataSourceViewChanged); } this._currentViewValid = true; } return this._currentView; } protected internal override void CreateChildControls() { this.Controls.Clear(); if (this.ViewState["_!ItemCount"] != null) { this.CreateControlHierarchy(false); } else { this.itemsArray = new ArrayList(); } base.ClearChildViewState(); } protected virtual void CreateControlHierarchy(bool useDataSource) { IEnumerable data = null; int dataItemCount = -1; if (this.itemsArray != null) { this.itemsArray.Clear(); } else { this.itemsArray = new ArrayList(); } if (!useDataSource) { dataItemCount = (int) this.ViewState["_!ItemCount"]; if (dataItemCount != -1) { data = new DummyDataSource(dataItemCount); this.itemsArray.Capacity = dataItemCount; } } else { data = this.GetData(); ICollection is2 = data as ICollection; if (is2 != null) { this.itemsArray.Capacity = is2.Count; } } if (data != null) { int itemIndex = 0; bool flag = this.separatorTemplate != null; dataItemCount = 0; if (this.headerTemplate != null) { this.CreateItem(-1, ListItemType.Header, useDataSource, null); } foreach (object obj2 in data) { if (flag && (dataItemCount > 0)) { this.CreateItem(itemIndex - 1, ListItemType.Separator, useDataSource, null); } ListItemType itemType = ((itemIndex % 2) == 0) ? ListItemType.Item : ListItemType.AlternatingItem; RepeaterItem item = this.CreateItem(itemIndex, itemType, useDataSource, obj2); this.itemsArray.Add(item); dataItemCount++; itemIndex++; } if (this.footerTemplate != null) { this.CreateItem(-1, ListItemType.Footer, useDataSource, null); } } if (useDataSource) { this.ViewState["_!ItemCount"] = (data != null) ? dataItemCount : -1; } } protected virtual DataSourceSelectArguments CreateDataSourceSelectArguments() { return DataSourceSelectArguments.Empty; } protected virtual RepeaterItem CreateItem(int itemIndex, ListItemType itemType) { return new RepeaterItem(itemIndex, itemType); } private RepeaterItem CreateItem(int itemIndex, ListItemType itemType, bool dataBind, object dataItem) { RepeaterItem item = this.CreateItem(itemIndex, itemType); RepeaterItemEventArgs e = new RepeaterItemEventArgs(item); this.InitializeItem(item); if (dataBind) { item.DataItem = dataItem; } this.OnItemCreated(e); this.Controls.Add(item); if (dataBind) { item.DataBind(); this.OnItemDataBound(e); item.DataItem = null; } return item; } public override void DataBind() { if ((!this.IsBoundUsingDataSourceID || !base.DesignMode) || (base.Site != null)) { this.RequiresDataBinding = false; this.OnDataBinding(EventArgs.Empty); } } protected void EnsureDataBound() { try { this._throwOnDataPropertyChange = true; if (this.RequiresDataBinding && (this.DataSourceID.Length > 0)) { this.DataBind(); } } finally { this._throwOnDataPropertyChange = false; } } protected virtual IEnumerable GetData() { DataSourceView view = this.ConnectToDataSourceView(); if (view != null) { return view.ExecuteSelect(this.SelectArguments); } return null; } protected virtual void InitializeItem(RepeaterItem item) { ITemplate itemTemplate = null; switch (item.ItemType) { case ListItemType.Header: itemTemplate = this.headerTemplate; goto Label_005B; case ListItemType.Footer: itemTemplate = this.footerTemplate; goto Label_005B; case ListItemType.Item: break; case ListItemType.AlternatingItem: itemTemplate = this.alternatingItemTemplate; if (itemTemplate != null) { goto Label_005B; } break; case ListItemType.Separator: itemTemplate = this.separatorTemplate; goto Label_005B; default: goto Label_005B; } itemTemplate = this.itemTemplate; Label_005B: if (itemTemplate != null) { itemTemplate.InstantiateIn(item); } } protected override bool OnBubbleEvent(object sender, EventArgs e) { bool flag = false; if (e is RepeaterCommandEventArgs) { this.OnItemCommand((RepeaterCommandEventArgs) e); flag = true; } return flag; } protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); this.Controls.Clear(); base.ClearChildViewState(); this.CreateControlHierarchy(true); base.ChildControlsCreated = true; } protected virtual void OnDataPropertyChanged() { if (this._throwOnDataPropertyChange) { throw new HttpException(System.Web.SR.GetString("DataBoundControl_InvalidDataPropertyChange", new object[] { this.ID })); } if (this._inited) { this.RequiresDataBinding = true; } this._currentViewValid = false; } protected virtual void OnDataSourceViewChanged(object sender, EventArgs e) { this.RequiresDataBinding = true; } protected internal override void OnInit(EventArgs e) { base.OnInit(e); if (this.Page != null) { this.Page.PreLoad += new EventHandler(this.OnPagePreLoad); if (!base.IsViewStateEnabled && this.Page.IsPostBack) { this.RequiresDataBinding = true; } } } protected virtual void OnItemCommand(RepeaterCommandEventArgs e) { RepeaterCommandEventHandler handler = (RepeaterCommandEventHandler) base.Events[EventItemCommand]; if (handler != null) { handler(this, e); } } protected virtual void OnItemCreated(RepeaterItemEventArgs e) { RepeaterItemEventHandler handler = (RepeaterItemEventHandler) base.Events[EventItemCreated]; if (handler != null) { handler(this, e); } } protected virtual void OnItemDataBound(RepeaterItemEventArgs e) { RepeaterItemEventHandler handler = (RepeaterItemEventHandler) base.Events[EventItemDataBound]; if (handler != null) { handler(this, e); } } protected internal override void OnLoad(EventArgs e) { this._inited = true; this.ConnectToDataSourceView(); if (((this.Page != null) && !this._pagePreLoadFired) && (this.ViewState["_!ItemCount"] == null)) { if (!this.Page.IsPostBack) { this.RequiresDataBinding = true; } else if (base.IsViewStateEnabled) { this.RequiresDataBinding = true; } } base.OnLoad(e); } private void OnPagePreLoad(object sender, EventArgs e) { this._inited = true; if (this.Page != null) { this.Page.PreLoad -= new EventHandler(this.OnPagePreLoad); if (!this.Page.IsPostBack) { this.RequiresDataBinding = true; } if ((this.Page.IsPostBack && base.IsViewStateEnabled) && (this.ViewState["_!ItemCount"] == null)) { this.RequiresDataBinding = true; } this._pagePreLoadFired = true; } } protected internal override void OnPreRender(EventArgs e) { this.EnsureDataBound(); base.OnPreRender(e); } [DefaultValue((string) null), TemplateContainer(typeof(RepeaterItem)), WebSysDescription("Repeater_AlternatingItemTemplate"), PersistenceMode(PersistenceMode.InnerProperty), Browsable(false)] public virtual ITemplate AlternatingItemTemplate { get { return this.alternatingItemTemplate; } set { this.alternatingItemTemplate = value; } } public override ControlCollection Controls { get { this.EnsureChildControls(); return base.Controls; } } [WebSysDescription("Repeater_DataMember"), DefaultValue(""), WebCategory("Data")] public virtual string DataMember { get { object obj2 = this.ViewState["DataMember"]; if (obj2 != null) { return (string) obj2; } return string.Empty; } set { this.ViewState["DataMember"] = value; this.OnDataPropertyChanged(); } } [Bindable(true), WebSysDescription("BaseDataBoundControl_DataSource"), WebCategory("Data"), DefaultValue((string) null), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public virtual object DataSource { get { return this.dataSource; } set { if (((value != null) && !(value is IListSource)) && !(value is IEnumerable)) { throw new ArgumentException(System.Web.SR.GetString("Invalid_DataSource_Type", new object[] { this.ID })); } this.dataSource = value; this.OnDataPropertyChanged(); } } [WebSysDescription("BaseDataBoundControl_DataSourceID"), DefaultValue(""), IDReferenceProperty(typeof(DataSourceControl)), WebCategory("Data")] public virtual string DataSourceID { get { object obj2 = this.ViewState["DataSourceID"]; if (obj2 != null) { return (string) obj2; } return string.Empty; } set { this.ViewState["DataSourceID"] = value; this.OnDataPropertyChanged(); } } [Browsable(true)] public override bool EnableTheming { get { return base.EnableTheming; } set { base.EnableTheming = value; } } [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(RepeaterItem)), WebSysDescription("Repeater_FooterTemplate"), DefaultValue((string) null)] public virtual ITemplate FooterTemplate { get { return this.footerTemplate; } set { this.footerTemplate = value; } } [DefaultValue((string) null), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(RepeaterItem)), WebSysDescription("WebControl_HeaderTemplate"), Browsable(false)] public virtual ITemplate HeaderTemplate { get { return this.headerTemplate; } set { this.headerTemplate = value; } } protected bool Initialized { get { return this._inited; } } protected bool IsBoundUsingDataSourceID { get { return (this.DataSourceID.Length > 0); } } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), WebSysDescription("Repeater_Items")] public virtual RepeaterItemCollection Items { get { if (this.itemsCollection == null) { if (this.itemsArray == null) { this.EnsureChildControls(); } this.itemsCollection = new RepeaterItemCollection(this.itemsArray); } return this.itemsCollection; } } [PersistenceMode(PersistenceMode.InnerProperty), Browsable(false), TemplateContainer(typeof(RepeaterItem)), WebSysDescription("Repeater_ItemTemplate"), DefaultValue((string) null)] public virtual ITemplate ItemTemplate { get { return this.itemTemplate; } set { this.itemTemplate = value; } } protected bool RequiresDataBinding { get { return this._requiresDataBinding; } set { this._requiresDataBinding = value; } } protected DataSourceSelectArguments SelectArguments { get { if (this._arguments == null) { this._arguments = this.CreateDataSourceSelectArguments(); } return this._arguments; } } [WebSysDescription("Repeater_SeparatorTemplate"), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(RepeaterItem)), Browsable(false), DefaultValue((string) null)] public virtual ITemplate SeparatorTemplate { get { return this.separatorTemplate; } set { this.separatorTemplate = value; } } } }