2010-01-22 6 views
5

Propertygrid에 액세스 할 때 ConvertTo 메서드 만 호출됩니다 (많은 경우). 이렇게하면 "Foo!" propertygrid의 문자열. 편집을 위해 클릭하면 예외 Cannot convert object of type Foo to type System.String. (정확히 번역되지 않음)이 표시됩니다. ConvertFrom 메서드가 호출되지 않습니다. 단서가 필요한 이유는 무엇입니까? 그리고이 오류는 문자열이 아니라 문자열로 변환하려고한다는 것을 나타냅니다.Propertygrid의 TypeConverter는 문자열에서 변환 만합니다.

이 개체를 편집하고 싶을 때 Foo에서 string으로 변환해야하고 편집을 마치면 다시 편집해야한다고 생각합니다.

StringConverter 클래스 :

public class FooTypeConverter : StringConverter { 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { 
     return new Foo((string) value); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { 
     return "Foo!"; 
    } 

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { 
     return true; 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { 
     return true; 
    } 
} 

속성에 액세스하고 있습니다 :

Foo _foo = new Foo(); 
[Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(UITypeEditor))] 
[TypeConverter(typeof(FooTypeConverter))] 
public Foo Foo { 
    get { 
     return _foo; 
    } 
    set { 
     _foo = value; 
    } 
} 
+0

내가 알아 낸 나는 것을 사용하지 않으면이는 MultilineStringEditor 함께 할 수있는 뭔가가, 그것은 올바르게 작동합니다. –

+0

방금 ​​업데이트를 보았습니다. 당신 자신의 에디터를 작성해야 할 것입니다. -'MultilineStringEditor'는'Foo'를 어떻게 처리하는지 알지 못하기 때문에, "no"라고 말하거나, 예외를 제기하고 처리하고 있습니다. –

답변

5

업데이트 : 당신은 분명히 연결해야합니다

class FooEditor : UITypeEditor 
{ 
    MultilineStringEditor ed = new MultilineStringEditor(); 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     Foo foo = value as Foo; 
     if (foo != null) 
     { 
      value = new Foo((string)ed.EditValue(provider, foo.Value)); 
     } 
     return value;   
    } 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return ed.GetEditStyle(); 
    } 
    public override bool IsDropDownResizable { 
     get { return ed.IsDropDownResizable; } 
    } 
} 

: 여기에 심으로 일해야 FooEditor

[TypeConverter(typeof(FooTypeConverter))] 
[Editor(typeof(FooEditor), typeof(UITypeEditor))] 
class Foo { /* ... */ } 
+0

그것은 그것을하는 것처럼 보인다, 고마워! 나는 UITypeEditor와 TypeConverter 둘 다 사용할 수 있다고 생각했다. –

+0

@Robert - 여전히 할 수 있습니다 .-p 다른 일부 컨트롤 ('DataGridView' 등)은 편집기가 아닌 변환기 만 사용한다는 것을 잊지 마십시오. –

0

가 재현 할 수있다; 그것은 나를 위해 잘 작동합니다. destinationType을 테스트하고 value, btw 유형을 테스트해야합니다. 그러나 중지하는 것이 아니라 ConvertFrom입니다. 이 아닌을 호출하는 완전한 예제가 있습니까 (아마도 다음을 기반으로합니다) ConvertFrom?

using System; 
using System.ComponentModel; 
using System.Globalization; 
using System.Windows.Forms; 
public class FooTypeConverter : StringConverter { 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     return new Foo("FooTypeConverter.ConvertFrom: " + Convert.ToString(value)); 
    } 
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     return "FooTypeConverter.ConvertTo: " + ((Foo)value).Value; 
    } 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return true; 
    } 
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     return true; 
    } 
} 
[TypeConverter(typeof(FooTypeConverter))] 
class Foo 
{ 
    public string Value { get; set; } 
    public Foo(string value) { Value = value; } 

    public override string ToString() 
    { 
     return "Foo.ToString"; 
    } 
} 
class Test 
{ 
    public Foo Foo { get; set; } 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     using(Form form = new Form()) 
     using (PropertyGrid grid = new PropertyGrid()) 
     { 
      grid.Dock = DockStyle.Fill; 
      grid.SelectedObject = new Test { Foo = new Foo("Main") }; 
      form.Controls.Add(grid); 
      Application.Run(form); 
     } 
    } 
} 
관련 문제