2009-01-14 5 views
12

Ich verwende C# und habe ein Windows-Formular, das ein Eigenschaftsrastersteuerelement enthält.Ist es möglich, eine in einem Eigenschaftsraster angezeigte Eigenschaft als Kennwortfeld zu markieren?

Ich habe das SelectedObject des PropertyGrid einer Einstellungsdatei zugewiesen, die anzeigt und ich kann die Einstellungen bearbeiten. Eine der Einstellungen ist jedoch ein Passwort - und ich möchte, dass es Sternchen im Feld und nicht den reinen Textwert der Passworteinstellung anzeigt.

Das Feld wird beim Speichern verschlüsselt, aber ich möchte, dass es sich wie ein normales Passwort-Eingabefeld mit Sternchen verhält, die angezeigt werden, wenn der Benutzer das Passwort eingibt.

Ich frage mich, ob es ein Attribut gibt, das auf die Einstellungseigenschaft angewendet werden kann, um es als ein Kennwort zu markieren?

Danke.

Antwort

1

Ich glaube nicht, Sie Property in Sternchen zu tauschen bekommen können, aber man könnte vielleicht einen Einweg-Typ-Wandler und einen modalen Editor ... wie so verwenden:

using System; 
using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
class Foo 
{ 
    [TypeConverter(typeof(PasswordConverter))] 
    [Editor(typeof(PasswordEditor), typeof(UITypeEditor))] 
    public string Password { get; set; } 

    // just to show for debugging... 
    public string PasswordActual { get { return Password; } } 
} 
class PasswordConverter : TypeConverter 
{ 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType) 
    { 
     return destinationType == typeof(string) ? "********" : 
      base.ConvertTo(context, culture, value, destinationType); 


    } 
} 
class PasswordEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     IWindowsFormsEditorService svc = (IWindowsFormsEditorService) 
      provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (svc != null) { 
      TextBox tb; 
      Button btn; 
      Form frm = new Form { Controls = { 
       (tb = new TextBox { PasswordChar = '*', Dock = DockStyle.Top, 
        Text = (string)value}), 
       (btn = new Button { Text = "OK", Dock = DockStyle.Bottom, DialogResult = DialogResult.OK}) 
      }, AcceptButton = btn}; 

      if (frm.ShowDialog() == DialogResult.OK) 
      { 
       value = tb.Text; 
      } 
     } 
     return value; 
    } 
} 
static class Program { 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form { 
      Controls = { 
       new PropertyGrid { 
        Dock = DockStyle.Fill, 
        SelectedObject = new Foo { Password = "Bar"} 
       } 
      } 
     }); 
    } 
} 
+0

Die angenommene Antwort besagt, dass Sie (tun können, was das OP fragte)! – noelicus

1

Hier ist, was ich habe in der Vergangenheit gemacht. Es zeigt "********" für das Passwort im Grid an, mit einer "..." Taste, um dem Benutzer zu erlauben, das Passwort zu setzen (unter Verwendung eines von Ihnen gelieferten Dialogs).

public class User 
{ 
    [TypeConverter(typeof(PasswordConverter))] 
    [Editor(typeof(PasswordEditor), typeof(UITypeEditor))] 
    public string Password { get; set; } 
} 

public class PasswordConverter : TypeConverter 
{ 
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     if (destinationType == typeof(string)) return true; 

     return base.CanConvertTo(context, destinationType); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
    { 
     if (destinationType == typeof(string)) 
     { 
      string password = (string)value; 

      if (password != null && password.Length > 0) 
      { 
       return "********"; 
      } 
     } 

     return base.ConvertTo(context, culture, value, destinationType); 
    } 
} 

public class PasswordEditor : UITypeEditor 
{ 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     string password = (string)value; 

     // Show a dialog allowing the user to enter a password 

     return password; 
    } 

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
} 
Verwandte Themen