c# - studio - ¿Es posible marcar una propiedad que se muestra en una cuadrícula de propiedades como un campo de contraseña?
textbox visual studio password (3)
Comenzando con .Net 2, puede usar PasswordPropertyTextAttribute adjuntado a su propiedad de contraseña.
Espero que esto ayude.
Estoy usando C # y tengo un formulario de Windows que contiene un control de cuadrícula de propiedad.
He asignado SelectedObject de propertygrid 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 contraseña.
El campo se encriptará cuando se guarde, pero quiero que se comporte como un cuadro de entrada de contraseña normal con asteriscos que se muestran 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 una contraseña.
Gracias.
Esto es lo que hice en el pasado. Muestra "********" para la contraseña en la cuadrícula, con un "..." botón para permitir al usuario establecer la contraseña (utilizando un cuadro de diálogo que usted suministra).
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 obtener PropertyGrid para cambiar a asteriscos, pero quizás podría usar un convertidor de tipo unidireccional y un editor modal ... como ese:
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"}
}
}
});
}
}