日期:2014-05-18  浏览次数:21270 次

VS 属性编辑器问题
我做了个自定义控件,里面有一个List<Point>的属性。
可是将它拖到窗体中后,无法在编辑器里面修改属性的值。
List<Point>中可以添加删除点,但每个Point的X和Y的值都无法改变,编辑器显示“对象与目标类型不匹配”。如图:

网上找了很久,问题原因好像是由于Point属于struct,没法直接在List<>里面修改元素的成员。
比如一个集合List<Point> points;points[0].X=10;就会出现错误“无法修改“System.Collections.Generic.List<System.Drawing.Point>.this[int]”的返回值,因为它不是变量”

最后找到官网上:https://connect.microsoft.com/VisualStudio/feedback/details/552326/collectioneditor-cannot-be-used-with-list-point#tabs,[b]一位老外反馈了这个问题,但没有解决办法…………我只知道似乎可以给属性设置自定义的TypeCoverter来解决,但对这个东西不了解,网上搜的方法试了半天没弄清楚,求高人指教了![/b]

------解决方案--------------------
using System;
using System.ComponentModel;
using System.Globalization;
using System.Drawing;

public class PointConverter : TypeConverter {
// Overrides the CanConvertFrom method of TypeConverter.
// The ITypeDescriptorContext interface provides the context for the
// conversion. Typically, this interface is used at design time to 
// provide information about the design-time container.
public override bool CanConvertFrom(ITypeDescriptorContext context, 
Type sourceType) {

if (sourceType == typeof(string)) {
return true;
}
return base.CanConvertFrom(context, sourceType);
}
// Overrides the ConvertFrom method of TypeConverter.
public override object ConvertFrom(ITypeDescriptorContext context, 
CultureInfo culture, object value) {
if (value is string) {
string[] v = ((string)value).Split(new char[] {','});
return new Point(int.Parse(v[0]), int.Parse(v[1]));
}
return base.ConvertFrom(context, culture, value);
}
// Overrides the ConvertTo method of TypeConverter.
public override object ConvertTo(ITypeDescriptorContext context, 
CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(string)) {
return ((Point)value).X + "," + ((Point)value).Y;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
------解决方案--------------------
不错不错,有水平
------解决方案--------------------
http://topic.csdn.net/u/20111002/12/bcc5a9a4-dc3d-46cb-9e97-165006c4f7e1.html
------解决方案--------------------
集合应该是用类似如下 collection editor 去编辑
// ContactCollectionEditor.cs
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Reflection;

namespace Samples.AspNet.CS.Controls
{
public class ContactCollectionEditor : CollectionEditor
{
public ContactCollectionEditor(Type type)
: base(type)
{
}

protected override bool CanSelectMultipleInstances()
{
return false;
}

protected override Type CreateCollectionItemType()
{
return typeof(Contact);
}
}
}