C#Winformでよく見られるEditorおよびその他の経験

20815 ワード

1、カスタムエディタを新規作成し、継承する.NETに付属のEditor、overrideのいくつかの方法は、属性に追加されます.
public class MyCollectionEditor : CollectionEditor

{

    public MyCollectionEditor(Type type) : base(type)

    {

    }

    protected override void ShowHelp()

    {

        MessageBox.Show(" , 。");

    }

}

[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]

public List<B> Bs2 { get; set; }

上図は、リスト編集ボックスで「Help」をクリックしたときの操作を再定義しています.普通はこのように使います.
2、よくあるエディタ
1)ArrayEditor、CollectionEditorから継承
2)BinaryEditor
3)CollectionEditor
4)DateTimeEditor
5)MultilineStringEditor
6)BitmapEditor、ImageEditorから継承
7)ColorEditor
8)ContentAlignmentEditor
9)CursorEditor
10)FontEditor
11)FontNameEditor
12)IconEditor
13)ImageEditor
14)MetafileEditor
15)UItypeEditor、これらのベースクラスはすべて、彼らがそれを継承することができます.私たちはどうしてできませんか.
16)QueuePathEditor
17)D a t o r C o r o l R e f erenceCollectionEditor、CollectionEditorから継承
18)AppSettings ExpressionEditor、ExpressionEditorから継承
19)CollectionEditorBase、CollectionEditorから継承
20)ConnectionStringEditor
21)C o n nectionStringsExpressionEditor、ExpressionEditorから継承
22)DataBindingCollectionEditor
23)ExpressionEditor
24)ExpressionCollectionEditor
25)ImageUrlEditor、UrlEditorから引き継ぐ
26)MailFileEditor、UrlEditorから継承
27)MdbDataFileEditor、UrlEditorから継承
28)ResourceExpressionEditor、ExpressionEditorから継承
29)RouteUrlEditor、ExpressionEditorから継承
30)RouteValueExpressionEditor、ExpressionEditorから継承
31)ServiceReferenceCollectionEditor、CollectionEditorBaseから継承
32)UpdatePanelTriggerCollectionEditor、CollectionEditorBaseから継承
33)UrlEditor
34)UserControlFileEditor、UrlEditorから継承
35)AnchorEditor
36)BorderSidesEditor
37)DockEditor
38)FileNameEditor
39)FolderNameEditor
40)FormatStringEditor
41)ImageListImageEditor
42)ShortcutKeysEditor
43)BindingUIEditor
44)TypeBrowserEditor
一部のWebネーミングスペースに記録されていない方法を探したり、オブジェクトブラウザでEditorを検索したり、Editorで終わるクラスを見つけたり、UItypeEditorから継承したりすればよい.
3、展開可能な項目の例
[TypeConverter(typeof(ExpandableObjectConverter))]

public class B

{

    public int Name1 { get; set; }

    public int Name2 { get; set; }

    public override string ToString()

    {

        return Name1 + "-" + Name2;

    }

}

public class A

{

    public A()

    {

        if (Bs == null)

        {

            Bs = new B();

        }

    }

    public B Bs { get; set; }

}

4、ドロップダウンボックスの例
public class XXXConverter : StringConverter

{

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)

    {

        return new StandardValuesCollection(StringArray);

    }

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)

    {

        return true;

    }

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)

    {

        return true;

    }

    public static string[] StringArray = new[] { "AAA", "BBB" };

}
[TypeConverter(typeof(XXXConverter))]

public string Name2 { get; set; }

5、有効性検証例
public class OneTo32Converter : Int32Converter

{

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)

    {

        var result = (int)base.ConvertFrom(context, culture, value);

        if (result < 1 || result > 32)

        {

            throw new Exception(" 1 32 。");

        }

        return result;

    }

}
[TypeConverter(typeof(OneTo32Converter))]

public int Name1 { get; set; }

6、配列のカスタマイズ表示および展開ダイアログの除去例
public class XXXArrayConverter : ArrayConverter

{

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)

    {

        return "sssss";

    }

}
[TypeConverter(typeof(XXXArrayConverter)), Editor(typeof(UITypeEditor), typeof(UITypeEditor))]

public B[] Bs { get; set; }

7、Converter及びEditor総括
uintタイプのプロパティに添付されている場合:
Converterは、この属性に使用されるタイプuintと表示に使用されるタイプstringとの間の変換である.
ConvertFromはstringをuintに変換します.
ConvertToはuintをstringに変換します.
DateTimeEditorを使用している場合:
このEditorはuintとDateTimeの間の変換に使用される.
DateTimeEditorはDateTimeとDateTimeの間の変換のみを処理するので、EditValueメソッドでuintとDateTimeの変換を完了します.
public class MyDateTimeEditor : DateTimeEditor

{

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

    {

        var result = (DateTime) base.EditValue(context, provider, new DateTime(1970, 1, 1).AddSeconds((uint) value));

        return (uint) ((result - new DateTime(1970, 1, 1)).TotalSeconds);

    }

}
[TypeConverter(typeof(UInt32Converter)), Editor(typeof(MyDateTimeEditor), typeof(UITypeEditor))]

public uint C { get; set; }

Converterは入力値を処理するときの動作で、有効性の検証、フォーマットの変換などによく使われますが、Editorはドロップダウンや新しいウィンドウを開くときの動作を処理します.同じプロパティで共存できます.
8、カスタムフォームの例
public class MyUITypeEditor : UITypeEditor

{

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

    {

        var picker = new Form1((uint) value);

        if (picker.ShowDialog() == DialogResult.OK)

        {

            return picker.Seconds;

        }

        return value;

    }



    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)

    {

        return UITypeEditorEditStyle.Modal;

    }

}

9、編集可能な複合オブジェクト
public class A

{

    public A()

    {

        if (EndPoint == null)

        {

            EndPoint = new PGIPEndPoint

                {

                    IPAddress = "255.255.255.255",

                    Port = 65535

                };

        }

    }

    [TypeConverter(typeof(IPEndPointConverter))]

    public PGIPEndPoint EndPoint { get; set; }

}
public class IPEndPointConverter : ExpandableObjectConverter

{

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)

    {

        return true;

    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)

    {

        return true;

    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)

    {

        var result = ((string)value).Split(':');

        var ip = IPAddress.Parse(result[0]);

        var port = Convert.ToInt32(result[1]);

        if (port < 0 || port > 65535)

        {

            throw new Exception(string.Format("{0} 0 65535 。", port));

        }

        return new PGIPEndPoint

            {

                IPAddress = ip.ToString(),

                Port = port

            };

    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)

    {

        var result = (PGIPEndPoint)value;

        return string.Format("{0}:{1}", result.IPAddress, result.Port);

    }

}

public class PGIPEndPoint

{

    [TypeConverter(typeof(IPConverter))]

    public string IPAddress { get; set; }

    [TypeConverter(typeof(ZeroTo65535Converter))]

    public int Port { get; set; }

}



public class ZeroTo65535Converter : Int32Converter

{

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)

    {

        var result = Convert.ToInt32(value);

        if (result < 0 || result > 65535)

        {

            throw new Exception(string.Format("{0} 0 65535 。", result));

        }

        return result;

    }

}



public class IPConverter : StringConverter

{

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)

    {

        return (IPAddress.Parse((string)value)).ToString();

    }

}

10、属性の表示順序
PropertyGridコントロールのPropertySortをNoSortに設定すると、プロパティが切り取られたときの順序で表示されます.
11、ツールバーの削除
ToolBarVisibleをFalseに設定します.