Редактирование дат и паролей в PropertyGrid
От: baloo  
Дата: 16.12.03 15:35
Оценка:
Для редактирования сложных типов в PropertyGrid можно создавать свой редактор типов.
Редактор представляет собой класс который наследует UITypeEditor и переопределяет методы
EditValue и GetEditStyle. Таким способом, например, не составляет труда открыть свою
модальную форму или подставить календарь для выбора даты.

Но есть две проблемы:
1. Как можно форматировать полученную строку?
Например, если нужно вводить пароль, как забить строку звездочками?
Или отформатировать дату?
2. Как перехватить сообщение об ошибке, которое появляется, если, например, ввести
неправильную дату от руки?

Может кто-нибудь подскажет, в каком направлении тут рыть?
Спасибо.

22.12.03 12:59: Перенесено модератором из '.NET' — TK
Re: Редактирование дат и паролей в PropertyGrid
От: Алексей Одинцов Россия  
Дата: 16.12.03 15:46
Оценка:
Здравствуйте, baloo, Вы писали:
B>Может кто-нибудь подскажет, в каком направлении тут рыть?
TypeConvertor
... << RSDN@Home 1.1.0 stable >>
Re[2]: Редактирование дат и паролей в PropertyGrid
От: baloo  
Дата: 16.12.03 17:33
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>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
От: Алексей Одинцов Россия  
Дата: 16.12.03 18:26
Оценка:
Здравствуйте, baloo, Вы писали:
точно не помню, но попробуйте так:
public class LoginControl : Control
{
// ...
    [TypeConverter(typeof(PasswordStringConverter))]
    public string Password
    { //...
}
... << RSDN@Home 1.1.0 stable >>
Re[4]: Редактирование дат и паролей в PropertyGrid
От: Алексей Одинцов Россия  
Дата: 16.12.03 18:37
Оценка:
да. все так и есть.
вот код конвертера:
    public class PasswordStringConverter : StringConverter
    {
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            object result = base.ConvertTo (context, culture, value, destinationType);
            if( result is string )
                return "**************";
            else
                return result;
        }
    }


только, естественно, в InitializeComponent строка в чистом виде будет
что вполне логично что с этим можно сделать уже другой вопрос...
... << RSDN@Home 1.1.0 stable >>
Re[5]: Редактирование дат и паролей в PropertyGrid
От: Алексей Одинцов Россия  
Дата: 16.12.03 18:41
Оценка:
нда, а еще он не спасает, просто потому что звездочки будут на обновлении, после установки свойства. а до этого — будут буквы.
... << RSDN@Home 1.1.0 stable >>
Re[3]: Редактирование дат и паролей в PropertyGrid
От: mikа Stock#
Дата: 16.12.03 18:50
Оценка:
Здравствуйте, baloo, Вы писали:

B>если в методе EditValue обратиться к параметру context, то можно добраться до

B>TypeConverter: context.PropertyDescriptor.Converter
B>он возвращает System.ComponentModel.StringConverter

А зачем тебе TypeConverter?

Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'.
Re[4]: Редактирование дат и паролей в PropertyGrid
От: Алексей Одинцов Россия  
Дата: 16.12.03 18:53
Оценка:
Здравствуйте, mikа, Вы писали:
M>Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'.
а если это string property?
... << RSDN@Home 1.1.0 stable >>
Re[5]: Редактирование дат и паролей в PropertyGrid
От: mikа Stock#
Дата: 16.12.03 19:04
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>Здравствуйте, mikа, Вы писали:

M>>Если тебе нужно дату устанавливать — то ты уже нашел способ, а если пароль вводить — то добавляй TextBox Установи только перед этим у него свойство PasswordChar в '*'.
АО>а если это string property?

Какая разница? Главное что нужно переконвертировать из TextBox.Text. В данном случае нам нужна строка поэтому смело возвращаем значение TextBox.Text из метода EditValue
Re[6]: Редактирование дат и паролей в PropertyGrid
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.12.03 19:13
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>нда, а еще он не спасает, просто потому что звездочки будут на обновлении, после установки свойства. а до этого — будут буквы.


Тогда придется вместо строки использовать специальный класс и перекрыть его метод ToString
... << RSDN@Home 1.1.2 beta 1 (mobile station) >>
AVK Blog
Re[3]: Редактирование дат и паролей в PropertyGrid
От: V.Petrovski Беларусь  
Дата: 16.12.03 19:16
Оценка:
Здравствуйте, baloo, Вы писали:

B>Здравствуйте, Алексей Одинцов, Вы писали:


АО>>TypeConvertor


B>В MSDN есть примеры использования TypeConverter для класса.

B>В этом случае объект становится редактируемым в PropertyGride.
B>Но, мне нужно редактировать Property.

B>Вот фрагмент кода


B>
B>public class MyDateEditor : UITypeEditor
B>{
B>    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
B>    {
B>        return UITypeEditorEditStyle.DropDown;
B>    }
B>    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
B>    {
B>        IWindowsFormsEditorService wfes;
B>        System.Windows.Forms.MonthCalendar ca = new System.Windows.Forms.MonthCalendar();
B>        Component cmp =    (Component) provider.GetType().GetProperty("Component").GetGetMethod().Invoke(provider, new object[0]);
B>        wfes = (IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService));
B>        wfes.DropDownControl(ca);
B>        wfes.CloseDropDown();
B>        return ca.SelectionStart;
B>    }
B>}
B>


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
От: baloo  
Дата: 17.12.03 09:55
Оценка:
Здравствуйте, 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;}
}



Честно говоря, подстановка контрола может быть и приемлема в случае с паролем, но
является обходом проблемы, а не решением.
Желательно разобраться во внутренних механизмах, нащупать, так сказать, генеральную линию.
А, линия эта, по моему мнению (некомпетентному), лежит где-то среди конвертеров,
едитеров и еще каких фичь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.