• 控件属性中使用继承TypeConverter对Color[]与string进行转换


    如果控件的属性是一个数组的时候,如何才能将对象保存下来,又如何将它解析出来呢?使用TypeConverter类可以实现这样的转换。比如今天我所遇到的就是Color[]转换到string保存,并从string解析出来。

    控件的CustomColor属性如下定义:
            private Color[] m_CustomColor = new Color[0];

            [Category(
    "Appearance"),
            TypeConverter(
    typeof(ColorConverter)),
            Description(
    "自定义字符随机颜色。")]
            
    public Color[] CustomColor
            
    {
                
    get{return m_CustomColor;}
                
    set{m_CustomColor = value;}
            }

    然后定义ColorConverter类:
    using System;
    using System.Drawing;
    using System.Globalization;
    using System.ComponentModel;
    using System.ComponentModel.Design.Serialization;

    namespace FaibClass.WebControls
    {
        
    internal class ColorConverter : TypeConverter
        
    {
            
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            
    {
                
    if (sourceType == typeof(string))
                
    {
                    
    return true;
                }


                
    return base.CanConvertFrom(context, sourceType);
            }


            
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
            
    {
                
    if (destinationType == typeof(string))
                
    {
                    
    return true;
                }

                
    else if (destinationType == typeof(InstanceDescriptor))
                
    {
                    
    return true;
                }


                
    return base.CanConvertTo(context, destinationType);
            }


            
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
            
    {
                
    if (value is string)
                
    {
                    
    //从字符串中解析出十六进制格式的颜色值,并转成Color
                    string[] value1 = value.ToString().Split(';');
                    Color[] col 
    = new Color[value1.Length];
                    
    for(int i = 0; i < value1.Length; i++)
                    
    {
                        col[i] 
    = Util.FromHexColor(value1[i]);
                    }

                    
    return col;
                }


                
    return base.ConvertFrom(context, culture, value);
            }


            
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
            
    {
                
    if (destinationType == typeof(string))
                
    {
                    
    //将Color数组转换成 #ffffff;#ccddaa;#00ddcc 这样格式的字符串保存
                    Color[] col = (Color[])value;
                    
    string[] sto = new string[col.Length];
                    
    for(int i = 0; i < col.Length; i++)
                    
    {
                        sto[i] 
    = Util.ConvertToHexColor(col[i]);
                    }

                    
    return string.Join(";", sto);
                }

                
    else if (destinationType == typeof(InstanceDescriptor) && (value is Color[]))
                
    {
                    Color[] col 
    = (Color[])value;
                    
    string[] sto = new string[col.Length];
                    
    for(int i = 0; i < col.Length; i++)
                    
    {
                        sto[i] 
    = Util.ConvertToHexColor(col[i]);
                    }

                    
    return new InstanceDescriptor(typeof(Color[]).GetConstructor(new Type[] typeof(string) }), new string[] string.Join(";", sto) } );
                }


                
    return base.ConvertTo(context, culture, value, destinationType);
            }

        }

    }

    以上来用到了两个方法,分别是将颜色转成十六进制格式的值,另一个是反转:
    using System.Drawing;
    using System.Web.UI.WebControls;

    internal class Util
    {
            
    //将颜色转换为十六进制
            internal static string ConvertToHexColor(Color c)
            
    {
                WebColorConverter wcc 
    = new WebColorConverter();
                
    return wcc.ConvertToString(c);
            }


            
    //将颜色转换为十六进制
            internal static Color FromHexColor(string c)
            
    {
                WebColorConverter wcc 
    = new WebColorConverter();
                
    return (Color)wcc.ConvertFromString(c);
            }


    }
  • 相关阅读:
    使用GitHub建立自己的个人主页
    学习Linux第二天
    学习Linux第一天
    网页布局基础
    HTML弹出窗口
    CSS进阶
    HTML+CSS入门
    廖老师JavaScript教程高阶函数-sort用法
    获取页面的title值
    if...else...这段代码打印结果,并简述其理由
  • 原文地址:https://www.cnblogs.com/faib/p/751712.html
Copyright © 2020-2023  润新知