如何在DevExpress PropertyGridControl中使用密码char

时间:2017-03-08 19:43:39

标签: c# devexpress

如果我将一个对象分配给PropertyGridControl.SelectedObjuect then I can use [PasswordPropertyTextAttribute(true)] for the password property并且效果很好。

但是我传递了一个实现ICustomTypeDescriptor的对象,如下所示,这没有效果:

AttributeCollection ICustomTypeDescriptor.GetAttributes()
{
    AttributeCollection attrColl = TypeDescriptor.GetAttributes(this, true);
    Attribute [] attrs = new Attribute[attrColl.Count + 1];
    attrColl.CopyTo(attrs, 0);
    attrs[attrs.Length-1] = new PasswordPropertyTextAttribute(true);
    return new AttributeCollection(attrs);
}

有没有办法实现这个目标?我们正在使用Windows Forms& C#。

1 个答案:

答案 0 :(得分:0)

事实是使用了不正确的方法来获得所需的结果。如ICustomTypeDescriptor.GetAttributes MSDN文章中所述,此方法返回此组件实例的自定义属性集合。 但是,要将属性分配给目标对象的属性,需要覆盖ICustomTypeDescriptor.GetProperties方法。在特定情况下,您可以按以下方式实施该方法:

 PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
        {
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this, attributes, true);
            return UpdateProperties(props);
        }
         PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
        {
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this, true);
            return UpdateProperties(props);
        }
         private PropertyDescriptorCollection UpdateProperties(PropertyDescriptorCollection props)
        {
            List<PropertyDescriptor> newProps = new List<PropertyDescriptor>();
            PropertyDescriptor current;
            foreach (PropertyDescriptor prop in props)
            {
                current = prop;
                if (prop.Name == "UserPassword")
                    current = TypeDescriptor.CreateProperty(typeof(UserInfo), prop, new Attribute[] { new PasswordPropertyTextAttribute(true) });
                newProps.Add(current);
            }
            return new PropertyDescriptorCollection(newProps.ToArray()); ;
        }