Est-il possible de marquer une propriété affichée dans une grille de propriétés en tant que champ de mot de passe

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

Question

J'utilise C # et j'ai un formulaire Windows contenant un contrôle de grille de propriétés.

J'ai assigné l'objet SelectedObject de propertygrid à un fichier de paramètres, qui s'affiche et me permet de modifier les paramètres. Cependant, l’un des paramètres est un mot de passe - et j’aimerais qu’il affiche des astérisques dans le champ plutôt que la valeur de texte brut du paramètre de mot de passe.

Le champ sera crypté lors de l'enregistrement, mais je souhaite qu'il se comporte comme une zone de saisie de mot de passe normale avec des astérisques affichés lorsque l'utilisateur saisit le mot de passe.

Je me demande s'il est possible d'attribuer un attribut à la propriété de paramètre pour le marquer comme étant un mot de passe?

Merci.

Était-ce utile?

Autres conseils

Voici ce que j'ai déjà fait par le passé. Il affiche " ******** " pour le mot de passe dans la grille, avec un " ... " bouton permettant à l'utilisateur de définir le mot de passe (à l'aide de la boîte de dialogue fournie).

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

Je ne pense pas que PropertyGrid puisse être échangé contre des astérisques, mais vous pouvez peut-être utiliser un convertisseur de type unidirectionnel et un éditeur modal ... comme suit:

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"}
                }
            }
        });
    }
}
scroll top