diff Demo/WinForms/Controls/EnumSelector.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Controls/EnumSelector.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,107 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Drawing.Design;
+
+using BLToolkit.ComponentModel;
+using System.Reflection;
+
+namespace BLToolkit.Demo.Controls
+{
+	public partial class EnumSelector : GroupBox
+	{
+		public EnumSelector()
+		{
+			InitializeComponent();
+		}
+
+		public EnumSelector(IContainer container)
+		{
+			container.Add(this);
+
+			InitializeComponent();
+		}
+
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[Category("Data")]
+		[Bindable(true)]
+		public  object  Value
+		{
+			get
+			{
+				foreach (RadioButton r in _controls.Keys)
+					if (r.Checked)
+						return Enum.Parse(_valueType, (string)_controls[r]);
+
+
+				return -1;
+			}
+			set
+			{
+				if (value != null)
+				{
+					string s = value.ToString();
+
+					foreach (DictionaryEntry de in _controls)
+					{
+						RadioButton r = (RadioButton)de.Key;
+
+						if (r.Checked != (de.Value.ToString() == s))
+							r.Checked = !r.Checked;
+					}
+				}
+			}
+		}
+
+		const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+
+		private Hashtable _controls = new Hashtable();
+
+		private Type _valueType;
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[TypeConverter(typeof(TypeTypeConverter))]
+		[Editor(typeof(EnumEditor), typeof(UITypeEditor))]
+		public  Type  ValueType
+		{
+			get { return _valueType; }
+			set
+			{
+				_valueType = value;
+
+				foreach (Control c in _controls.Keys)
+					Controls.Remove(c);
+
+				FieldInfo[] fields = _valueType.GetFields();
+
+				foreach (FieldInfo fi in fields)
+				{
+					if ((fi.Attributes & EnumField) == EnumField)
+					{
+						RadioButton r = new RadioButton();
+
+						Controls.Add(r);
+						_controls.Add(r, fi.Name);
+
+						r.Text     = fi.Name;
+						r.Name     = fi.Name + "RadioButton";
+						r.TabIndex = _controls.Count;
+						r.AutoSize = true;
+						r.Location = new System.Drawing.Point(10, 23 * _controls.Count - 4);
+						r.UseVisualStyleBackColor = true;
+					}
+				}
+			}
+		}
+
+		class EnumEditor : ComponentModel.Design.TypeEditor
+		{
+			protected override bool FilterTypeList(Type type)
+			{
+				return type.IsPublic && type.IsEnum;
+			}
+		}
+	}
+}