Для редактирования сложных типов в PropertyGrid можно создавать свой редактор типов.
Редактор представляет собой класс который наследует UITypeEditor и переопределяет методы
EditValue и GetEditStyle. Таким способом, например, не составляет труда открыть свою
модальную форму или подставить календарь для выбора даты.
Но есть две проблемы:
1. Как можно форматировать полученную строку?
Например, если нужно вводить пароль, как забить строку звездочками?
Или отформатировать дату?
2. Как перехватить сообщение об ошибке, которое появляется, если, например, ввести
неправильную дату от руки?
Может кто-нибудь подскажет, в каком направлении тут рыть?
Спасибо.
22.12.03 12:59: Перенесено модератором из '.NET' — TK
Здравствуйте, Алексей Одинцов, Вы писали:
АО>TypeConvertor
В MSDN есть примеры использования TypeConverter для класса.
В этом случае объект становится редактируемым в PropertyGride.
Но, мне нужно редактировать Property.
Вот фрагмент кода
public class MyDateEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
IWindowsFormsEditorService wfes;
System.Windows.Forms.MonthCalendar ca = new System.Windows.Forms.MonthCalendar();
Component cmp = (Component) provider.GetType().GetProperty("Component").GetGetMethod().Invoke(provider, new object[0]);
wfes = (IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
wfes.DropDownControl(ca);
wfes.CloseDropDown();
return ca.SelectionStart;
}
}
В описании свойства указываем свой едитор
[EditorAttribute(typeof(MyDateEditor), typeof(UITypeEditor))]
public DateTime MyDate2
{
get {return _myDate2;}
set {_myDate2 = value;}
}
если в методе EditValue обратиться к параметру context, то можно добраться до
TypeConverter: context.PropertyDescriptor.Converter
он возвращает System.ComponentModel.StringConverter
А, как ему подставить свой конвертер?
В интернете я не нашел ни одного примера.
Re[3]: Редактирование дат и паролей в PropertyGrid
Здравствуйте, baloo, Вы писали:
B>если в методе EditValue обратиться к параметру context, то можно добраться до B>TypeConverter: context.PropertyDescriptor.Converter B>он возвращает System.ComponentModel.StringConverter
А зачем тебе TypeConverter?
Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'.
Re[4]: Редактирование дат и паролей в PropertyGrid
Здравствуйте, mikа, Вы писали: M>Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'.
а если это string property?
... << RSDN@Home 1.1.0 stable >>
Re[5]: Редактирование дат и паролей в PropertyGrid
Здравствуйте, Алексей Одинцов, Вы писали:
АО>Здравствуйте, mikа, Вы писали: M>>Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'. АО>а если это string property?
Какая разница? Главное что нужно переконвертировать из TextBox.Text. В данном случае нам нужна строка поэтому смело возвращаем значение TextBox.Text из метода EditValue
Re[6]: Редактирование дат и паролей в PropertyGrid
Здравствуйте, Алексей Одинцов, Вы писали:
АО>нда, а еще он не спасает, просто потому что звездочки будут на обновлении, после установки свойства. а до этого — будут буквы.
Тогда придется вместо строки использовать специальный класс и перекрыть его метод ToString
Здравствуйте, baloo, Вы писали:
B>Здравствуйте, Алексей Одинцов, Вы писали:
АО>>TypeConvertor
B>В MSDN есть примеры использования TypeConverter для класса. B>В этом случае объект становится редактируемым в PropertyGride. B>Но, мне нужно редактировать Property.
B>Вот фрагмент кода
B>
B>[EditorAttribute(typeof(MyDateEditor), typeof(UITypeEditor))]
B>public DateTime MyDate2
B>{
B> get {return _myDate2;}
B> set {_myDate2 = value;}
B>}
B>
B>если в методе EditValue обратиться к параметру context, то можно добраться до B>TypeConverter: context.PropertyDescriptor.Converter B>он возвращает System.ComponentModel.StringConverter
B>А, как ему подставить свой конвертер? B>В интернете я не нашел ни одного примера.
Converter — Это ITypeConveter, а ты реализовал ITypeEditor.
Разницу понял?
... << RSDN@Home 1.1.0 stable silent>>
Re[4]: Редактирование дат и паролей в PropertyGrid
Здравствуйте, mikа, Вы писали:
M>Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'.
В случае с паролем, первое, что пришло в голову — подставить TextBox, а
потом сохранить ввод в приватной переменной.
Но TextBox раскрывается как список, у IWindowsFormsEditorService есть
метод ShowDialog, но он требует форму.
Если же вводить буковки не раскрывая список, прямо в поле PropertyGrid, то
обычные буковки и вводятся. Как подставить TextBox на место поля в PropertyGrid
во время ввода?
public class TextPasswordEditor : UITypeEditor
{
private IWindowsFormsEditorService wfes;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown; // .Modal; в случае контрола,
// здесь не имеет значения, что стойт
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
Params pp = (Params) context.Instance; // Params - это класс, который вываливается
// в PropertyGrid для редактирования
wfes = (IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
System.Windows.Forms.TextBox tbx = new System.Windows.Forms.TextBox();
tbx.Text = (string) value;
tbx.PasswordChar = Convert.ToChar("*");
tbx.BorderStyle = System.Windows.Forms.BorderStyle.None;
wfes.DropDownControl(tbx);
// wfes.ShowDialog( здесь можно подставить только форму )string ss = tbx.Text.ToString();
// прячем ввод в приватной переменной _authPwd2
pp.GetType().InvokeMember("_authPwd2", BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField
, null, pp, new object[] {ss}); // так как переменная приватная, к ней нельзя обратиться напрямуюreturn"*********";
}
}
// это само свойство "пароль" в классе Params
[CategoryAttribute("Аутентификация")]
[EditorAttribute(typeof(TextPasswordEditor), typeof(UITypeEditor))]
public string AuthPwd
{
get {return _authPwd;}
set {_authPwd = value;}
}
Честно говоря, подстановка контрола может быть и приемлема в случае с паролем, но
является обходом проблемы, а не решением.
Желательно разобраться во внутренних механизмах, нащупать, так сказать, генеральную линию.
А, линия эта, по моему мнению (некомпетентному), лежит где-то среди конвертеров,
едитеров и еще каких фичь.