PDA

View Full Version : سوال: تغییر عناصر یک enum در پنجره Properties



iman89
پنج شنبه 25 آذر 1389, 17:39 عصر
سلام
توی یک یوزر کنترل میخوام یک پراپرتی تعریف کنم که نوعش از یک enum باشه که فرضا مقدارهایی بصورت زیر داره


enum MyEnum
{
Black2008,
Blue2009,
Red2010
}

تا اینجا که مشکلی نیست. مشکلم اینه که میخوام توی پنجره Properties این مقدارها بصورت زیر نمایش داده بشن


2008 - Black
2009 - Blue
2010 - Red

سوال اینجاست که چطور این کار رو انجام بدم؟ و یا بصورت کلی چه راههایی وجود داره که بشه یک پراپرتی تعریف کرد که کاربر فقط بتونه از بین داده های بالا انتخاب کنه؟
پیشاپیش ممنونم.

hadi-z
پنج شنبه 25 آذر 1389, 17:50 عصر
فکر کنم منظورتون اینه:


public enum MyPropertyType
{
myValue1,
myValue2,
myValue3
}

private MyPropertyType _MyProperty;
public MyPropertyType MyProperty
{
get { return _MyProperty; }
set { _MyProperty = value; }
}

iman89
پنج شنبه 25 آذر 1389, 18:37 عصر
دوست عزیز فکر کنم توضیحاتم کامل باشه ، مشکل من با تعریف پراپرتی نیست مشکلم اینه که میخوام این پراپرتی توی پنجره Properties عناصرش عوض بشه. مثلا برای مثال شما توی پنجره Properties پراپرتی MyProperty با داده های زیر نمایش داده بشه و فقط از بین این داده ها بشه انتخاب کرد.

myValue - 1
myValue - 2
myValue - 3
این داده ها فقط توی پنجره Properties به این صورت هستند و توی برنامه به همون صورت داده های enum نمایش داده میشن.
این موضوع رو توی بعضی از کامپوننتها دیدم ولی نمیدونم چطور این کار رو انجام بدم. یک مقدار با Attributeها هم ور رفتم ولی به جایی نرسیدم.:متفکر:

hadi-z
پنج شنبه 25 آذر 1389, 18:56 عصر
دوست عزیز
این کدی که من نوشتم دقیقا همین کارو میکنه


63709
http://barnamenevis.org/images/misc/pencil.png

hadi-z
پنج شنبه 25 آذر 1389, 19:06 عصر
در وافع باید از نوع enum یک شی تعریف کرد و property مورد نظر رو از نوع شی اول تعریف کرد تا اتفاق مورد نظر شما حاصل بشه.

iman89
پنج شنبه 25 آذر 1389, 20:01 عصر
دوست عزیز خواهشا یکبار دیگه سوال رو بخونید.
من میخوام توی پنجره Properties بجای "myValue1" مقدار "my Value - 1" رو نمایش بده.
همونطور که میدونید توی تعریف مقدارهای یک enum نمیشه مقداری تعریف کرد که بین کلمات اون فاصله باشه و باید کلمات به هم چسبیده باشند. من نیاز دارم این مقدارها توی پنجره Properties بصورت کلمات جدا از هم نمایش داده بشه.
برای مثال کامپوننتها شرکت ComponentFactory پراپرتیی دارند با نام PaletteMode ، که این پراپرتی توی پنجره Properties بصورت کلمات جدا از هم نمایش داده میشه ولی توی محیط کد نویسی بصورت کلمات سرهم.
و یا در SQL Server و برنامه Generate Script ، در مرحله Options تنظیماتی انجام میشه ، یکیشون ورژن اسکریپت رو تعیین میکنه ، مقدارهایی که کاربر انتخاب میکنه "SQL Server 2000" و "SQL Server 2005" است ولی این ورژنها در اصل با "version80" و "version90" شناخته میشه.
حالا من چطور برای پراپرتیهای خودم هم این قابلیت رو استفاده کنم؟

iman89
جمعه 26 آذر 1389, 10:06 صبح
دوستان کسی نیست کمکم کنه؟

Reza_Yarahmadi
جمعه 26 آذر 1389, 11:08 صبح
ابتدا کلاسی بصورت زیر تعریف کنید

using System.Reflection;
using System.Globalization;



class MyConverter : EnumConverter
{
private Type _enumType;
public MyConverter(Type type) : base(type)
{
_enumType = type;
}

public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destType)
{
FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, value));
DescriptionAttribute dna = (DescriptionAttribute)Attribute.GetCustomAttribute (
fi, typeof(DescriptionAttribute));

if (dna != null)
return dna.Description;
else
return value.ToString();
}

public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
foreach (FieldInfo fi in _enumType.GetFields())
{
DescriptionAttribute dna =
(DescriptionAttribute)Attribute.GetCustomAttribute (
fi, typeof(DescriptionAttribute));

if ((dna != null) && ((string)value == dna.Description))
return Enum.Parse(_enumType, fi.Name);
}
return Enum.Parse(_enumType, (string)value);
}
}بعد enum و پراپرتی مورد نظرتون رو بصورت زیر تغییر بدید.

public enum MyEnum
{
[Description("2008 - Black")]
Black2008,
[Description("2009 - Blue")]
Blue2009
}
[TypeConverter(typeof(MyConverter))]
public MyEnum MyProp{ get; set; }