2009-01-14 7 views
12

Używam C# i mam formularz okna zawierający kontrolkę siatki właściwości.Czy można oznaczyć właściwość wyświetlaną w siatce właściwości jako pole hasła

Przydzielono SelectedObject obiektu propertygrid do pliku ustawień, który wyświetla i pozwala edytować ustawienia. Jednak jednym z ustawień jest hasło - i chciałbym, aby wyświetlał w polu gwiazdki, a nie zwykły tekst ustawienia hasła.

Pole zostanie zaszyfrowane po zapisaniu, ale chcę, aby zachowywał się jak normalne okno wprowadzania hasła z gwiazdkami wyświetlanymi, gdy użytkownik wprowadza hasło.

Zastanawiam się, czy istnieje atrybut, który można zastosować do właściwości ustawienia, aby oznaczyć go jako hasło?

Dzięki.

Odpowiedz

1

Nie sądzę, można uzyskać PropertyGrid zamienić się gwiazdkami, ale można chyba użyć jednokierunkową typu konwerter i edytor modalny ... tak:

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

Przyjęta odpowiedź mówi, że możesz (wykonaj to, o co prosił OP)! – noelicus

1

Oto co ja zrobiliśmy to w przeszłości. Wyświetla "********" dla hasła w siatce, z przyciskiem "...", aby umożliwić użytkownikowi ustawienie hasła (za pomocą okna dialogowego, które podajesz).

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; 
    } 
} 
Powiązane problemy