2010-02-15 10 views
2

을 사용할 수 없습니다복사 붙여 넣기가 나는</p> <p>홈페이지 파일과 같은 몇 가지 항목이 속성 그리드 내부 FileNameEditor을 가지고 재산권에 그리드

초 파일 : "C : \ blah2

등등.

내 문제는 하나의 속성 항목에서 다른 속성 항목으로 복사하여 붙여 넣을 수없고 수동으로 필드에 입력 할 수 없다는 것입니다. FileNameEditor 내에서 편집 할 수있는 특정 속성이 있습니까? 예

public class MyEditor : FileNameEditor 
{ 
    public override bool GetPaintValueSupported(ITypeDescriptorContext context) 
    { 
     return false; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 

    { 

     object e = base.EditValue(context, provider, value); 

     if ((value as MyFileS) != null) 
     { 
      (value as MyFilesS).FileName = (String) e; 
     } 

     return e; 
    } 

    protected override void InitializeDialog(OpenFileDialog openFileDialog) 
    { 
     base.InitializeDialog(openFileDialog); 
    } 
} 

감사

+0

이것은 WinForms 프로젝트이며 Form의 속성 표의 런타임 동작에 대해 논의하고 있습니다. 여기서 Property Grid는 일부 사용자 정의 속성을 구현합니까? – BillW

+0

두 질문에 모두 동의 함 – ababeel

답변

1

? 객체에 문자열 속성 만 있으면 Marc Gravell의 대답이 작동합니다.

그러나 속성 표 안에있는 개체의 "파일"속성이 사용자 지정 클래스 인 경우 사용자 지정 형식 변환기를 구현해야합니다.

예 :

namespace WindowsFormsApplication 
{ 
    using System; 
    using System.ComponentModel; 
    using System.Drawing.Design; 
    using System.Globalization; 
    using System.Windows.Forms; 
    using System.Windows.Forms.Design; 

    class MyEditor : FileNameEditor 
    { 
     public override bool GetPaintValueSupported(ITypeDescriptorContext context) 
     { 
      return false; 
     } 

     public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
     { 
      string s = Environment.CurrentDirectory; 
      object e = base.EditValue(context, provider, value); 
      Environment.CurrentDirectory = s; 

      var myFile = value as MyFile; 
      if (myFile != null && e is string) 
      { 
       myFile.FileName = (string)e; 
       return myFile; 
      } 

      return e; 
     } 
    } 

    class MyFileTypeConverter : TypeConverter 
    { 
     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 
      if (sourceType == typeof(string)) 
       return true; 

      return base.CanConvertFrom(context, sourceType); 
     } 

     public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
     { 
      if (destinationType == typeof(string)) 
       return true; 

      return base.CanConvertTo(context, destinationType); 
     } 

     public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
     { 
      if (value is string) 
       return new MyFile { FileName = (string)value }; 

      return base.ConvertFrom(context, culture, value); 
     } 

     public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
     { 
      var myFile = value as MyFile; 
      if (myFile != null && destinationType == typeof(string)) 
       return myFile.FileName; 

      return base.ConvertTo(context, culture, value, destinationType); 
     } 
    } 

    [TypeConverter(typeof(MyFileTypeConverter))] 
    [Editor(typeof(MyEditor), typeof(UITypeEditor))] 
    class MyFile 
    { 
     public string FileName { get; set; } 
    } 

    class MyFileContainer 
    { 
     public MyFileContainer() 
     { 
      File1 = new MyFile { FileName = "myFile1.txt" }; 
      File2 = new MyFile { FileName = "myFile2.txt" }; 
     } 

     public MyFile File1 { get; set; } 
     public MyFile File2 { get; set; } 
    } 

    static public class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      using (var f = new Form()) 
      using (var pg = new PropertyGrid()) 
      { 
       pg.Dock = DockStyle.Fill; 
       pg.SelectedObject = new MyFileContainer(); 
       f.Controls.Add(pg); 
       Application.Run(f); 
      } 
     } 
    } 
} 

자리에 파일 이름을 편집하고 또한 잘라 PropertyGrid가 다시 다시 '파일'형식으로 문자열로 변환하는 방법을 알 필요가 붙여 넣기 지원합니다. TypeConverter에서 문자열 메서드로 변환하지 않으면 개체의 ToString() 결과가 속성에 표시됩니다.

Reflector.Net을 사용하고 BCL의 UITypeEditors 및 TypeConverters에 대한 소스를 읽는 것이 좋습니다. Microsoft가 속성 표에서 Color, TimeSpan, DateTime 등을 편집하는 방법을 지원하는 데 유익한 정보가 될 수 있습니다.

또한 파일 대화 상자를 열 때주의하십시오. 조심하지 않으면 표준 WinForms 열린 파일 대화 상자가 응용 프로그램의 현재 작업 디렉토리를 변경할 수 있습니다. 필자는 FileNameEditor에이 문제가 있다고 생각하지 않지만 Windows 7에서만 테스트했습니다.

1

가 재현 할 수있다; 이 잘 작동 - 그리드 및 팝업에 모두 복사/붙여 넣을 수 있습니다 (귀하의 재산은 세터가 있습니까?) : 왜 당신이 사용자 정의 편집기를 사용하는

using System; 
using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
class Foo 
{ 
    [Editor(typeof(FileNameEditor), typeof(UITypeEditor))] 
    public string Name { get; set; } 

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