えムナウのプログラミングのページ

えムナウ の とどけもの

 Logo えムナウBlog@AILight
えムナウBlog@Wankuma

目次

利用状況

イメージ ギャラリー

カテゴリ

Links
 

inetaj

MSMVPロゴ
MSMVP Visual C# 2005/01-2007/12

目次

ユーザーコントロール

サンプル3 ユーザーコントロールの属性とタイプコンバータ


RefreshProperties [プロパティ] ウィンドウの表示を更新するときの型を示す識別子を定義します。
 All/None/Repaint
DesignerSerializationVisibility デザイン時シリアライザに対するプロパティの参照可能範囲を指定します。
 Content/Visible/Hidden
Serializable クラスをシリアル化できることを示します。
TypeConverter この属性が関連付けられているオブジェクトのコンバータとして使用する型を指定します。
 パラメータ付きコンストラクタによる初期化
 プロパティ表示で使用される文字列とクラスの双方向変換


        /// <summary>
        /// RefreshProperties(RefreshProperties.All) のサンプルです。
        /// 
        /// プロパティを変更するとRefreshPropertiesNoneと
        /// RefreshPropertiesRepaintが再表示されます。
        /// </summary>
        [RefreshProperties(RefreshProperties.All)]
        public int RefreshPropertiesAll 
        {
                get 
                {
                        return refreshPropertiesAll;
                }
                set 
                {
                        refreshPropertiesAll=value;
                        refreshPropertiesNone=value;
                        refreshPropertiesRepaint=value;
                }
        }

        /// <summary>
        /// RefreshProperties(RefreshProperties.None) のサンプルです。
        /// (デフォルト値)
        /// プロパティは変更してもRefreshPropertiesAllと
        /// RefreshPropertiesRepaintは再表示されません。
        /// </summary>
        [RefreshProperties(RefreshProperties.None)]
        public int RefreshPropertiesNone 
        {
                get 
                {
                        return refreshPropertiesNone;
                }
                set 
                {
                        refreshPropertiesAll=value;
                        refreshPropertiesNone=value;
                        refreshPropertiesRepaint=value;
                }
        }

        /// <summary>
        /// RefreshProperties(RefreshProperties.Repaint) のサンプルです。
        /// 
        /// プロパティを変更するとRefreshPropertiesAllと
        /// RefreshPropertiesNoneが再表示されます。
        /// </summary>
        [RefreshProperties(RefreshProperties.Repaint)]
        public int RefreshPropertiesRepaint 
        {
                get 
                {
                        return refreshPropertiesRepaint;
                }
                set 
                {
                        refreshPropertiesAll=value;
                        refreshPropertiesNone=value;
                        refreshPropertiesRepaint=value;
                }
        }

        /// <summary>
        /// DesignerSerializationVisibility(DesignerSerializationVisibility.Visible) のサンプルです。
        /// 
        /// 設定を作成しません。(setがあるとContentと同様に作成します。)
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public Complex[] ComplexValue1
        {
                get 
                {
                        return complexValue1;
                }
#if false
                set 
                {
                        complexValue1=value;
                }
#endif
        }

        /// <summary>
        /// DesignerSerializationVisibility(DesignerSerializationVisibility.Content) のサンプルです。
        /// 
        /// this.userControl11.ComplexValue2 = new UserControl1.Complex[] {
        /// new UserControl1.Complex(10, 70),
        /// new UserControl1.Complex(10, 20)};
        /// の設定を作成します。
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public Complex[] ComplexValue2
        {
                get 
                {
                        return complexValue2;
                }
        }

        /// <summary>
        /// DesignerSerializationVisibility(DesignerSerializationVisibility.Visible) のサンプルです。
        /// 
        /// this.userControl11.ComplexValue3 = new UserControl1.Complex(10, 20);
        /// の設定を作成します。
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public Complex ComplexValue3 
        {
                get 
                {
                        return complexValue3;
                }
                set 
                {
                        complexValue3=value;
                }
        }

        /// <summary>
        /// DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) のサンプルです。
        /// 
        /// 設定を作成しません。
        /// </summary>
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public Complex ComplexValue4
        {
                get 
                {
                        return complexValue4;
                }
                set 
                {
                        complexValue4=value;
                }
        }


/// <summary>
/// [Serializable] と [TypeConverter(typeof(ComplexConverter))]
/// のサンプルです。
/// [Serializable] でシリアル化可能になります。
/// [TypeConverter(typeof(ComplexConverter))] でタイプコンバーターを定義します。
/// </summary>
[Serializable]
[TypeConverter(typeof(ComplexConverter))]
public class Complex
{
        private double _r ;
        private double _i ;
        public Complex()
        {
                _r = 0 ;
                _i = 0 ;
        }
        public Complex(double re, double im)
        {
                _r = re ;
                _i = im ;
        }

        /// <summary>
        /// 実数部分を設定します
        /// [NotifyParentProperty(true)]
        /// </summary>
        [RefreshProperties(RefreshProperties.Repaint)]
        [NotifyParentProperty(true)]
        public double r
        {
                get
                {
                        return _r ;
                }
                set
                {
                        _r = value ;
                }
        }

        /// <summary>
        /// 虚数部分を設定します
        /// </summary>
        [RefreshProperties(RefreshProperties.Repaint)]
        [NotifyParentProperty(true)]
        public double i
        {
                get
                {
                        return _i ;
                }
                set
                {
                        _i = value ;
                }
        }
}
/// <summary>
/// Complex の為のタイプコンバーターです。
/// </summary>
internal class ComplexConverter : ExpandableObjectConverter 
{
        /// <summary>
        /// コンバータがオブジェクトを指定したコンテキストを使用して、指定した型から変換できるかどうかを示す値を返します。
        /// </summary>
        /// <param name="context">コンテキスト</param>
        /// <param name="sourceType">指定した型</param>
        /// <returns>コンバート可能な場合True</returns>
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
        {
                if (sourceType == typeof(string)) return true;
                return base.CanConvertFrom(context, sourceType);
        }

        /// <summary>
        /// コンバータがオブジェクトを指定したコンテキストを使用して、指定した型に変換できるかどうかを示す値を返します。
        /// </summary>
        /// <param name="context">コンテキスト</param>
        /// <param name="destinationType">指定した型</param>
        /// <returns>コンバート可能な場合True</returns>
        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
        {
                if (destinationType == typeof(string)) return true;
                if (destinationType == typeof(InstanceDescriptor)) return true;
                return base.CanConvertTo(context, destinationType);
        }

        /// <summary>
        /// 指定したコンテキストとカルチャ情報を使用して、指定した値オブジェクトを、指定した型から変換します。
        /// </summary>
        /// <param name="context">コンテキスト</param>
        /// <param name="culture">カルチャ情報</param>
        /// <param name="value">指定した値</param>
        /// <param name="sourceType">指定した型</param>
        /// <returns>変換した値</returns>
        public override object ConvertFrom(ITypeDescriptorContext context, 
                System.Globalization.CultureInfo culture, object value) 
        {
                if( value.GetType() == typeof(string) )
                {
                        Complex newval = new Complex(0,0) ;
                        string[] input = ((string)value).Split(new Char [] {','});
                        if ( input.GetLength(0) == 2 )
                        {
                                newval.r = double.Parse(input[0]);
                                newval.i = double.Parse(input[1]);
                        }
                        return newval;
                }
                return base.ConvertFrom(context, culture, value) ;
        }

        /// <summary>
        /// 指定したコンテキストとカルチャ情報を使用して、指定した値オブジェクトを、指定した型に変換します。
        /// </summary>
        /// <param name="context">コンテキスト</param>
        /// <param name="culture">カルチャ情報</param>
        /// <param name="value">指定した値</param>
        /// <param name="destType">指定した型</param>
        /// <returns>変換した値</returns>
        public override object ConvertTo(ITypeDescriptorContext context, 
                System.Globalization.CultureInfo culture, object value, Type destType) 
        {
                if (destType == typeof(string) && value is Complex) 
                {
                        Complex ic = (Complex)value;
                        return ic.r.ToString() + "," + ic.i.ToString() ;
                }
                if (destType == typeof(InstanceDescriptor) && value is Complex) 
                {
                        Complex ic = (Complex)value;
                        System.Reflection.ConstructorInfo ctor = typeof(Complex).GetConstructor(new Type[] {
                                        typeof(double), typeof(double) } ) ;
                        if (ctor != null) 
                        {
                                return new InstanceDescriptor(ctor, new object[] {ic.r, ic.i}) ;
                        }
                }
                return base.ConvertTo(context, culture, value, destType);
        }   
}