jenswinter.com
Software Development 24/7

How to: Passwort im PropertyGrid

November 25, 2005 21:16 by Jens
Wie kann das PropertyGrid verwendet werden um den Nutzer Passwörter eingeben zu lassen?
  • Die Passwort-Eigenschaft darf nicht im Klartext im Grid zu sehen sein. Stattdessen soll für jedes Zeichen ein Asterisk angezeigt werden.
  • Die korrekte Eingabe des Passwortes sollte über eine zweite Abfrage abgesichert werden.
Als Beispiel benutze ich die Klasse LoginInfo:

 

    public class LoginInfo

    {

        private string m_UserName;

        private string m_Password;

 

        [Category("Credentials")]

        public string UserName

        {

            get { return m_UserName; }

            set { m_UserName = value; }

        }

 

        [Category("Credentials")]

        public string Password

        {

            get { return m_Password; }

            set { m_Password = value; }

        }

    }

 

Eine Instanz soll vom Nutzer im PropertyGrid editiert werden können:

Man benötigt eine Klassenbibliothek, die das Formular für die Passworteingabe, eine von UITypeEditor abgeleitete Klasse und eine von StringConverter abgeleitete Klasse. Das Formular ist schnell zusammengeklickt. Nicht vergessen, die Eigenschaft PasswordChar der Textboxen auf "*" zu setzen. Das Formular erweitere ich noch um die Eigenschaft Passwor:

 

        public string Password

        {

            get { return PasswordTextBox.Text; }

        }

 

Und im Closing-Ereignis wird noch geprüft, ob die Inhalte der TextBoxen beim Klick auf den Ok-Schalter identisch sind:

 

        private void PasswordEditForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)

        {

            if (PasswordTextBox.Text != ConfirmPasswordTextBox.Text)

            {

                MessageBox.Show("Password values entered do not match.", "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Error);

                e.Cancel = true;

            }

        }

 

Der Eingabedialog soll erscheinen, wenn die Eigenschaft Password im PropertyGrid zum Bearbeiten ausgewählt wird. Dafür muss eine Klasse vom Typ UITypeEditor abegeleitet werden:

 

    public class PasswordEditor : UITypeEditor

    {

        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)

        {

            return UITypeEditorEditStyle.Modal;

        }

 

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

        {

            PasswordEditForm form = new PasswordEditForm();

            if (form.ShowDialog() == DialogResult.OK)

            {

                return form.Password;

            }

            else

            {

                return value;

            }

        }

    }

 

Die überschriebene Methode GetEditStyle liefert UITypeEditorEditStyle.Modal zurück, damit der kleine Schalter mit den drei Punkten im Grid erscheint. Das Überschreiben der Methode EditValue sorgt dafür, dass das Eingabeformular aufgerufen wird und dass der eingegebene Wert zurückgeliefert wird.

Zuletzt muss noch dafür gesorgt werden, dass im PropertyGrid immer nur Sternchen, und nicht der tatsächliche Inhalt der Passwort-Eigenschaft sichtbar sind. Dafür muss von der Klasse StringConverter abgeleitet werden:

 

    public class PasswordStringConverter : StringConverter

    {

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)

        {

            return false;

        }

 

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)

        {

            return String.Empty.PadLeft(((string)value).Length, '*');

        }

    }

 

CanConvertFrom liefert false zurück. Damit wird verhindert, dass der Nutzer bei der Eigenschaft Password einen Wert direkt eingeben kann. Er wird somit gezwungen, auf den Schalter zu drücken um die Eigenschaft zu setzen. ConvertTo sorgt dafür, dass nur noch Sternchen für das Grid zurückgeliefert werden.

Damit das Ganze auch wirkt, muss die LoginInfo-Klasse noch angepasst werden. Die Eigenschaft Password erhält nur noch die entsprechenden Attribute:

 

    public class LoginInfo

    {

        private string m_UserName;

        private string m_Password;

 

        [Category("Credentials")]

        public string UserName

        {

            get { return m_UserName; }

            set { m_UserName = value; }

        }

 

        [Category("Credentials")]

        [TypeConverter(typeof(PasswordStringConverter))]

        [Editor(typeof(PasswordEditor), typeof(UITypeEditor))]

        public string Password

        {

            get { return m_Password; }

            set { m_Password = value; }

        }

    }

 


Related posts

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

January 7. 2009 15:13