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();
}
}
}