none
propertygrid如何实现密码输入 RRS feed

  • 问题

  • 搜索了好久都没有找到,不知道propertygrid能不能实现这个功能。

    现在能实现的就是输入后变成"*",但是我希望的是能想textbox设置了usesystempasswordchar那样实时显示为"*"

    2010年5月19日 11:15

答案

  • 你好!

         自定义一个类型转换器就可以了:

    public   class   PasswordStringConverter:   StringConverter//System.ComponentModel.TypeConverter
    {
    public   override   bool   CanConvertFrom(ITypeDescriptorContext   context,   Type   sourceType)
    {
    return   base.CanConvertFrom   (context,   sourceType);
    }
    public   override   bool   CanConvertTo(ITypeDescriptorContext   context,   Type   destinationType)
    {
    if(   destinationType.GetType()   ==   typeof(string)   )
    return   true;

    return   base.CanConvertTo   (context,   destinationType);
    }
    public   override   object   ConvertTo(ITypeDescriptorContext   context,   CultureInfo   culture,   object   value,   Type   destinationType)
    {
    if(   value.GetType()   ==   typeof(string)   )
    {
    int   stringSize;
    string   retVal   =   "* ";
    Random   randomString   =   new   Random();


    if(   value   !=   null   )
    stringSize   =   ((string)value).Length;
    else
    stringSize   =   randomString.Next(   10   );

    for(   int   i   =   0;   i   <   stringSize;   i++   )
    retVal   +=   "* ";

    return   retVal;
    }

    return   base.ConvertTo   (context,   culture,   value,   destinationType);
    }
    public   override   bool   GetPropertiesSupported(ITypeDescriptorContext   context)
    {
    return   false;
    }
    public   override   StandardValuesCollection   GetStandardValues(ITypeDescriptorContext   context)
    {
    string[]   standardValues   =   new   string[1];
    int   stringSize;
    string   retVal   =   "* ";
    Random   randomString   =   new   Random();


    stringSize   =   randomString.Next(   10   );

    for(   int   i   =   0;   i   <   stringSize;   i++   )
    retVal   +=   "* ";

    standardValues[0]   =   retVal;

    return   new   StandardValuesCollection(   standardValues   );
    }
    }

    ///   <summary>
    ///   Summary   description   for   MyTextbox.
    ///   </summary>
    public   class   MyTextbox   :   System.Windows.Forms.TextBox
    {
    [TypeConverter(typeof(PasswordStringConverter))]
    public   new   string   Text
    {
    get
    {
    return   base.Text;
    }
    set
    {
    base.Text   =   value;
    }
    }
    }

    以上代码选自CodeProject!


    周雪峰
    • 已标记为答案 Kira Qian 2010年5月25日 9:31
    2010年5月19日 13:30
    版主
    • 已标记为答案 Kira Qian 2010年5月25日 9:31
    2010年5月24日 3:35
    版主

全部回复

  • 你好!

         自定义一个类型转换器就可以了:

    public   class   PasswordStringConverter:   StringConverter//System.ComponentModel.TypeConverter
    {
    public   override   bool   CanConvertFrom(ITypeDescriptorContext   context,   Type   sourceType)
    {
    return   base.CanConvertFrom   (context,   sourceType);
    }
    public   override   bool   CanConvertTo(ITypeDescriptorContext   context,   Type   destinationType)
    {
    if(   destinationType.GetType()   ==   typeof(string)   )
    return   true;

    return   base.CanConvertTo   (context,   destinationType);
    }
    public   override   object   ConvertTo(ITypeDescriptorContext   context,   CultureInfo   culture,   object   value,   Type   destinationType)
    {
    if(   value.GetType()   ==   typeof(string)   )
    {
    int   stringSize;
    string   retVal   =   "* ";
    Random   randomString   =   new   Random();


    if(   value   !=   null   )
    stringSize   =   ((string)value).Length;
    else
    stringSize   =   randomString.Next(   10   );

    for(   int   i   =   0;   i   <   stringSize;   i++   )
    retVal   +=   "* ";

    return   retVal;
    }

    return   base.ConvertTo   (context,   culture,   value,   destinationType);
    }
    public   override   bool   GetPropertiesSupported(ITypeDescriptorContext   context)
    {
    return   false;
    }
    public   override   StandardValuesCollection   GetStandardValues(ITypeDescriptorContext   context)
    {
    string[]   standardValues   =   new   string[1];
    int   stringSize;
    string   retVal   =   "* ";
    Random   randomString   =   new   Random();


    stringSize   =   randomString.Next(   10   );

    for(   int   i   =   0;   i   <   stringSize;   i++   )
    retVal   +=   "* ";

    standardValues[0]   =   retVal;

    return   new   StandardValuesCollection(   standardValues   );
    }
    }

    ///   <summary>
    ///   Summary   description   for   MyTextbox.
    ///   </summary>
    public   class   MyTextbox   :   System.Windows.Forms.TextBox
    {
    [TypeConverter(typeof(PasswordStringConverter))]
    public   new   string   Text
    {
    get
    {
    return   base.Text;
    }
    set
    {
    base.Text   =   value;
    }
    }
    }

    以上代码选自CodeProject!


    周雪峰
    • 已标记为答案 Kira Qian 2010年5月25日 9:31
    2010年5月19日 13:30
    版主
  • 这段代码我试过了,只能是输入完成后才变成"*"

    2010年5月19日 13:58
    • 已标记为答案 Kira Qian 2010年5月25日 9:31
    2010年5月24日 3:35
    版主