⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grouplist.cs

📁 ASP中web自定义控件的使用源码及说明文档
💻 CS
字号:
using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Bestcomy.Web.UI.WebControls
{
	/// <summary>
	/// 
	/// </summary>
	[ToolboxData("<{0}:GroupList runat=server></{0}:GroupList>"),ParseChildren(true,"GroupItems"),PersistChildren(false),DefaultEvent("SelectedIndexChanged"),ValidationProperty("SelectedItem"),Designer(typeof(GroupListDesigner))]
	public class GroupList : WebControl, INamingContainer, IPostBackDataHandler
	{
		public event EventHandler SelectedIndexChanged;
		private GroupItemCollection _items = new GroupItemCollection();
		private object dataSource;

		public GroupList() : base(HtmlTextWriterTag.Select)
		{
		}

		[DefaultValue(-1)]
		public int SelectedIndex
		{
			get
			{
				int _selectedIndex = -1;
				int num = 0;
				for(int i=0; i<this.GroupItems.Count; i++)
				{
					int idx = this.GroupItems[i].Items.FindSelected();
					if(idx > -1)
					{
						_selectedIndex = num + idx;
						break;
					}
					num += this.GroupItems[i].Items.Count;
				}
				return _selectedIndex;
			}
			set
			{
				if ((value < -1) || (value >= this.GroupListItemCount))
				{
					throw new ArgumentOutOfRangeException("value");
				}
				ClearSelection();
				int num = 0;
				for(int i=0; i<this.GroupItems.Count; i++)
				{
					if(value < num + this.GroupItems[i].Items.Count)
					{
						this.GroupItems[i].Items[value-num].Selected = true;
						break;
					}
					num += this.GroupItems[i].Items.Count;
				}
			}
		}

		public GroupListItem SelectedItem
		{
			get
			{
				for(int i=0; i<this.GroupItems.Count; i++)
				{
					int idx = this.GroupItems[i].Items.FindSelected();
					if(idx > -1)
					{
						return this.GroupItems[i].Items[idx];
					}
				}
				return null;
			}
		}

		public void ClearSelection()
		{
			for(int i=0; i<this.GroupItems.Count; i++)
			{
				for(int j=0; j<this.GroupItems[i].Items.Count; j++)
					this.GroupItems[i].Items[j].Selected = false;
			}
		}

		public GroupListItem FindByText(string text)
		{
			for(int i=0; i<this.GroupItems.Count; i++)
			{
				int idx = this.GroupItems[i].Items.FindByText(text);
				if(idx > -1)
					return this.GroupItems[i].Items[idx];
			}
			return null;
		}

		public GroupListItem FindByValue(string value)
		{
			for(int i=0; i<this.GroupItems.Count; i++)
			{
				int idx = this.GroupItems[i].Items.FindByValue(value);
				if(idx > -1)
					return this.GroupItems[i].Items[idx];
			}
			return null;
		}

		[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Editor(typeof(System.ComponentModel.Design.CollectionEditor), typeof(System.Drawing.Design.UITypeEditor)), PersistenceMode(PersistenceMode.InnerDefaultProperty), MergableProperty(false)]
		public GroupItemCollection GroupItems
		{
			get
			{
				return _items;
			}
		}

		public int GroupListItemCount
		{
			get
			{
				int num = 0;
				for(int i=0; i<this.GroupItems.Count; i++)
					num += this.GroupItems[i].Items.Count;
				return num;
			}
		}

		public virtual bool AutoPostBack
		{
			get
			{
				object obj1 = this.ViewState["AutoPostBack"];
				if (obj1 != null)
				{
					return (bool) obj1;
				}
				return false;
			}
			set
			{
				this.ViewState["AutoPostBack"] = value;
			}
		}

		[DefaultValue("")]
		public virtual string DataMember
		{
			get
			{
				object obj1 = this.ViewState["DataMember"];
				if (obj1 != null)
				{
					return (string) obj1;
				}
				return string.Empty;
			}
			set
			{
				this.ViewState["DataMember"] = value;
			}
		}

		[DefaultValue((string) null)]
		public object DataSource
		{
			get
			{
				return this.dataSource;
			}
			set
			{
				if (((value != null) && !(value is IListSource)) && !(value is IEnumerable))
				{
					throw new ArgumentException("unvalid data source.", this.ID);
				}
				this.dataSource = value;
			}
		}

		[DefaultValue("")]
		public virtual string DataGroupField
		{
			get
			{
				object obj1 = this.ViewState["DataGroupField"];
				if (obj1 != null)
				{
					return (string) obj1;
				}
				return string.Empty;
			}
			set
			{
				this.ViewState["DataGroupField"] = value;
			}
		}

		[DefaultValue("")]
		public virtual string DataTextField
		{
			get
			{
				object obj1 = this.ViewState["DataTextField"];
				if (obj1 != null)
				{
					return (string) obj1;
				}
				return string.Empty;
			}
			set
			{
				this.ViewState["DataTextField"] = value;
			}
		}

		[DefaultValue("")]
		public virtual string DataValueField
		{
			get
			{
				object obj1 = this.ViewState["DataValueField"];
				if (obj1 != null)
				{
					return (string) obj1;
				}
				return string.Empty;
			}
			set
			{
				this.ViewState["DataValueField"] = value;
			}
		}

		protected override void AddAttributesToRender(HtmlTextWriter writer)
		{
			if (this.Page != null)
			{
				this.Page.VerifyRenderingInServerForm(this);
			}
			writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
			if (this.AutoPostBack && (this.Page != null))
			{
				string text1 = this.Page.GetPostBackClientEvent(this, "");
				string text2 = base.Attributes["onchange"];
				if (text2 != null)
				{
					text1 = text2 + text1;
					base.Attributes.Remove("onchange");
				}
				writer.AddAttribute(HtmlTextWriterAttribute.Onchange, text1);
				writer.AddAttribute("language", "javascript");
			}
			base.AddAttributesToRender (writer);
		}

		protected override void RenderContents(HtmlTextWriter writer)
		{
			if(this.SelectedIndex == -1 && this.GroupListItemCount>0)
				this.SelectedIndex = 0;
			for(int i=0; i < this.GroupItems.Count; i++)
			{
				GroupItem gItem = this.GroupItems[i];
				writer.WriteBeginTag("OPTGROUP");
				writer.WriteAttribute("LABEL",gItem.Label,true);
				writer.Write(">");
				writer.WriteLine();
				for(int j=0; j < gItem.Items.Count; j++)
				{
					GroupListItem item = gItem.Items[j];
					writer.WriteBeginTag("OPTION");
					if(item.Selected)
						writer.WriteAttribute("selected", "selected", false);
					writer.WriteAttribute("value",item.Value,true);
					writer.Write(">");
					HttpUtility.HtmlEncode(item.Text,writer);
					writer.WriteEndTag("OPTION");
					writer.WriteLine();
				}
				writer.WriteEndTag("OPTGROUP");
				writer.WriteLine();
			}
		}

		protected override void TrackViewState()
		{
			base.TrackViewState ();
			((IStateManager)this.GroupItems).TrackViewState();
		}

		protected override object SaveViewState()
		{
			object obj1 = base.SaveViewState ();
			object obj2 = ((IStateManager)this.GroupItems).SaveViewState();
			if(obj1==null && obj2==null)
				return null;
			return new Pair(obj1, obj2);
		}

		protected override void LoadViewState(object savedState)
		{
			if(savedState!=null && savedState is Pair)
			{
				base.LoadViewState (((Pair)savedState).First);
				((IStateManager)this.GroupItems).LoadViewState(((Pair)savedState).Second);
			}
		}

		protected virtual void OnSelectedIndexChanged(EventArgs e)
		{
			if(SelectedIndexChanged != null)
				SelectedIndexChanged(this,e);
		}

		protected override void OnDataBinding(EventArgs e)
		{
			base.OnDataBinding (e);
			IEnumerable enumerable1 = DataSourceHelper.GetResolvedDataSource(this.DataSource, this.DataMember);
			if (enumerable1 != null && this.DataGroupField!=string.Empty && this.DataTextField!=string.Empty && this.DataValueField!=string.Empty)
			{
				if(this.DataGroupField == string.Empty)
					throw new ArgumentNullException("DataGroupField","DataGroupField required.");
				if(this.DataTextField == string.Empty && this.DataValueField == string.Empty)
					throw new ArgumentNullException("DataTextField","DataTextField required.");
				if(this.DataValueField == string.Empty)
					this.DataValueField = this.DataTextField;
				else if(this.DataTextField == string.Empty)
					this.DataTextField = this.DataValueField;

				this.GroupItems.Clear();
				foreach (object obj1 in enumerable1)
				{
					string groupText = DataBinder.GetPropertyValue(obj1,this.DataGroupField,null);
					GroupItem gItem;
					int idx = this.GroupItems.FindByText(groupText);
					if(idx > -1)
						gItem = this.GroupItems[idx];
					else
					{
						gItem = new GroupItem(groupText);
						GroupItems.Add(gItem);
					}
					GroupListItem item = new GroupListItem(DataBinder.GetPropertyValue(obj1,this.DataTextField,null), DataBinder.GetPropertyValue(obj1,this.DataValueField,null));
					gItem.Items.Add(item);
				}
			}
		}


		#region IPostBackDataHandler members

		public void RaisePostDataChangedEvent()
		{
			this.OnSelectedIndexChanged(EventArgs.Empty);
		}

		public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
		{
			string[] textArray1 = postCollection.GetValues(postDataKey);
			if (textArray1 != null)
			{
				GroupListItem item = this.FindByValue(textArray1[0]);
				if(item!=null)
				{
					if(this.SelectedItem == null)
						this.SelectedIndex = 0;
					string presentValue = this.SelectedItem.Value;
					this.ClearSelection();
					item.Selected = true;
					return string.Compare(presentValue,item.Value,true)!=0 && this.AutoPostBack;
				}
			}
			return false;
		}

		#endregion		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -