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; }
}
}