¿Es posible marcar una propiedad que se muestra en una cuadrícula de propiedades como un campo de contraseña

StackOverflow https://stackoverflow.com/questions/443411

Pregunta

Estoy usando C # y tengo un formulario de Windows que contiene un control de cuadrícula de propiedades.

He asignado el objeto seleccionado de la cuadrícula de propiedades a un archivo de configuración, que muestra y me permite editar la configuración. Sin embargo, una de las configuraciones es una contraseña, y me gustaría que muestre asteriscos en el campo en lugar del valor de texto sin formato de la configuración de la contraseña.

El campo se cifrará cuando se guarde, pero quiero que se comporte como un cuadro de entrada de contraseña normal con asteriscos mostrados cuando el usuario ingresa la contraseña.

Me pregunto si hay un atributo que se pueda aplicar a la propiedad de configuración para marcarlo como contraseña.

Gracias.

¿Fue útil?

Solución

Comenzando con .Net 2, puede usar el PasswordPropertyTextAttribute adjunto a su propiedad de contraseña.

Espero que esto ayude.

Otros consejos

Esto es lo que he hecho en el pasado. Muestra " ******** " para la contraseña en la cuadrícula, con un " ... " botón para permitir que el usuario establezca la contraseña (utilizando un cuadro de diálogo que proporcione).

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

No creo que pueda hacer que PropertyGrid cambie a asteriscos, pero tal vez podría usar un convertidor de tipo unidireccional y un editor modal ... así:

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"}
                }
            }
        });
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top