using System; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Globalization; using System.Reflection; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Drawing.Design;
namespace TestInstanceDescriptor {
[TypeConverter(typeof(MySizeTypeConverter))] public class MySize { private int _x,_y; public readonly static MySize Empty;
static MySize() { Empty = new MySize(); }
public MySize() { }
public MySize(int x,int y) { _x = x; _y = y; }
public int X { get { return _x; } set { _x = value; } }
public int Y { get { return _y; } set { _y = value; } }
public override string ToString() { return String.Format("{0},{1}",_x.ToString(),_y.ToString()); } }
public class MySizeTypeConverter:TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if(sourceType == typeof(string)) return true; else return base.CanConvertFrom(context,sourceType); }
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if(destinationType == typeof(string) || destinationType == typeof(InstanceDescriptor)) return true; else return base.CanConvertTo(context,destinationType); }
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value == null) { return null; } if (!(value is string)) { return base.ConvertFrom(context, culture, value); } string str = ((String)value).Trim(); if (str.Length == 0) { return MySize.Empty; } char[] splitchar = {','}; string[] values = ((string)value).Split(splitchar); if(values.Length != 2) return MySize.Empty; try { int x = Convert.ToInt32(values[0]); int y = Convert.ToInt32(values[1]); MySize s = new MySize(); s.X = x; s.Y = y; return s; } catch(FormatException) { return MySize.Empty; } }
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if(destinationType == typeof(InstanceDescriptor)) { MySize o = (MySize)value; Type intType = typeof(int); MemberInfo mi = typeof(MySize).GetConstructor(new Type[]{intType,intType}); object[] args = new object[] {o.X,o.Y}; return new InstanceDescriptor(mi,args); } if (destinationType != typeof(string)) { return base.ConvertTo(context, culture, value, destinationType); } if (value != null) { MySize size = (MySize)value; if(size != MySize.Empty) return size.ToString(); } return String.Empty; } }
/// <summary> /// Summary description for InstDescLabe. /// </summary> public class InstDescLabel:System.Web.UI.WebControls.Label { [EditorAttribute(typeof(MySizeEditor),typeof(UITypeEditor))] public MySize NewSize { get { object o = ViewState["Size"]; if(o == null) return MySize.Empty; return (MySize)o; } set { ViewState["Size"] = value; } }
public InstDescLabel() { // // TODO: Add constructor logic here // } }
public class MySizeEditor:UITypeEditor { public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; }
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { IWindowsFormsEditorService wfe = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); MySize o = (MySize)value;
if(wfe != null) { LabelComponentEditorForm form = new LabelComponentEditorForm(o.X,o.Y); using(form) { wfe.DropDownControl(form); return new MySize(form.X,form.Y); } } return base.EditValue (context, provider, value); }
}
public class LabelComponentEditorForm : System.Windows.Forms.UserControl //System.Windows.Forms.Form { private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox textBox2; public int X { get { return Convert.ToInt32(this.textBox1.Text); } }
public int Y { get { return Convert.ToInt32(this.textBox2.Text); } } /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.Container components = null;
public LabelComponentEditorForm() { // // Windows 窗体设计器支持所必需的 // InitializeComponent();
// // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // }
public LabelComponentEditorForm(int x,int y) : this() { this.textBox1.Text = x.ToString(); this.textBox2.Text = y.ToString(); }
/// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); }
#region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.label2 = new System.Windows.Forms.Label(); this.textBox2 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // label1 // this.label1.Location = new System.Drawing.Point(8, 16); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(88, 24); this.label1.TabIndex = 0; this.label1.Text = "请输入提示X:"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(96, 14); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(112, 21); this.textBox1.TabIndex = 1; this.textBox1.Text = ""; // // button1 // this.button1.Location = new System.Drawing.Point(120, 80); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(80, 24); this.button1.TabIndex = 2; this.button1.Text = "OK"; this.button1.Click += new System.EventHandler(this.button1_Click); // // label2 // this.label2.Location = new System.Drawing.Point(8, 48); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(88, 24); this.label2.TabIndex = 0; this.label2.Text = "请输入提示Y:"; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(96, 48); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(112, 21); this.textBox2.TabIndex = 1; this.textBox2.Text = ""; // // LabelComponentEditorForm // //this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(216, 114); this.Controls.Add(this.button1); this.Controls.Add(this.textBox1); this.Controls.Add(this.label1); this.Controls.Add(this.label2); this.Controls.Add(this.textBox2); //this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "LabelComponentEditorForm"; this.Text = "Form1"; this.ResumeLayout(false);
} #endregion
private void button1_Click(object sender, System.EventArgs e) { //this.Close(); } } }

|