? 객체에 문자열 속성 만 있으면 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에서만 테스트했습니다.
출처
2010-03-16 13:33:23
orj
이것은 WinForms 프로젝트이며 Form의 속성 표의 런타임 동작에 대해 논의하고 있습니다. 여기서 Property Grid는 일부 사용자 정의 속성을 구현합니까? – BillW
두 질문에 모두 동의 함 – ababeel