« プロパティエディタの指定 | トップページ | 独自のプロパティエディタ作成(ドロップダウン形式) »

2010年9月26日 (日)

独自のプロパティエディタ作成(ダイアログボックス形式)

「自作コントロールを使い易くする(説明表示系)」で例に出したCurrencyTextBoxクラスを使って、独自のプロパティエディタを定義してみる。

プロパティエディタには、大きく分けてダイアログボックス形式とドロップダウン形式の2種類が存在する。この形式の違いは、実際のエディタ作成の過程において、大きな違いがある。簡単な違いを下の表にまとめてみた。

編集画面の形式作成元クラス補足
ドロップダウン形式 UserControl 閉じる指示を行うボタン等は一般的にはつけない(?)
Flags属性のない列挙型の場合は、1つ項目を選択したら自動的に閉じる。
ダイアログボックス形式 Form モーダル表示のダイアログなので、通常OKボタン(DialogResult.OK)とキャンセルボタン(DialogResult.Cancel)を付ける。

さて、実際にプロパティエディタを作成するにあたり、今回はダイアログボックス形式のエディタを作成する事にする。どちらかといえば、2種類の形式うち、ダイアログボックス形式の方が簡単だからだ(それ程の違いはない)。

では、CurrencyTextBoxクラスの CurrencyValue プロパティにダイアログボックス形式のエディタを実装する為、まず以下の様な画面を CurrencyValueEditorForm クラスとして定義する。

常識的な事であるが、OKボタン/キャンセルボタン/フォームの下記赤枠内プロパティ値を設定しておく。

更に、編集対象としている CurrencyValue プロパティ値を外部クラスとこの画面でやりとりする為、この画面クラスにも同名の CurrencyValue プロパティを定義する。

public long CurrencyValue
{
    get
    {
        return (long)this.numValue.Value;
    }
    set
    {
        this.numValue.Value = value;
    }
}

コード中の numValue は、ダイアログボックス内の NumericUpDown コントロールの名前である。これで、CurrencyValueEditorForm の定義は終わりである。

次に、このエディタ画面とプロパティウィンドウから呼び出す橋渡しとなるクラスを定義する。このクラスは、UITypeEditor または、その派生クラスから継承して作成する。ここでは、UITypeEditor を継承し、クラス名は、CurrencyValueEditor とする。

internal class CurrencyValueEditor : UITypeEditor

そして、2つのメソッドをオーバーライドする。まずはそのうちの1つ、GetEditStyle メソッドを記述する。

public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
    // プロパティエディタとして、モーダル表示フォームを使用する事を通知
    return UITypeEditorEditStyle.Modal;
}

コメントがあるので特に改めて説明する事もないだろう。
では2つめの、EditValue メソッドを定義する。

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
    IWindowsFormsEditorService editorService = null;

    // MSDN UI 型エディターの実装 に基づいた記述
    if (provider != null)
    {
        editorService =
            provider.GetService(
            typeof(IWindowsFormsEditorService))
            as IWindowsFormsEditorService;
    }

    // MSDN UI 型エディターの実装 に基づいた記述
    if (editorService == null)
    {
        return value;
    }

    // CurrencyValueEditorForm を使用したプロパティエディタの表示
    using (CurrencyValueEditorForm frm = new CurrencyValueEditorForm())
    {
        frm.CurrencyValue = (long)value;    // 現在のプロパティ値をエディタ側に設定
        DialogResult dr = editorService.ShowDialog(frm);
        if (dr == DialogResult.OK)
        {
            return frm.CurrencyValue;       // 新しい設定値をプロパティ値として返す
        }
        else
        {
            return value;                   // エディタ呼び出し直前の設定値をそのまま返す
        }
    }
}

前半部分は、コメントの記述通り、MSDNの「UI型エディターの実装」を参考にしてある。後半部分は、ダイアログボックス形式のエディタ呼び出しなので、MSDNの例とはちょっと違うが、特に理解しにくいところはないだろう。ダイアログ表示の部分が、editorService.ShowDialog(呼び出す画面クラスのインスタンス)とする事がポイントである。
この2つのメソッドをオーバーライドすれば、このクラスの定義は終わりである。

最後に、今定義したエディタを使用するプロパティの部分に、ここで定義したエディタクラスを指定する。ここでは、CurrencyTextBoxクラスの CurrencyValue プロパティに、

[Category("表示")]
[Description("コントロール内のテキスト内容を数値で返します。")]
[DefaultValue(0L)]
[Editor(typeof(Acha_ya.SampleEditor.CurrencyValueEditor),
    typeof(System.Drawing.Design.UITypeEditor))]
public long CurrencyValue
{
    get
    {
        return currencyValue;
    }
    set
    {
        currencyValue = value;
        base.Text = value.ToString();
        if (ValueChanged != null) ValueChanged(this, EventArgs.Empty);
    }
}

と記述してコンパイルすれば終了である。
プロパティウィンドウで、CurrencyValue プロパティの項目を選択すると、右側に"…"ボタンが表示される様になる。

この"…"ボタンをクリックすれば、最初に定義したエディタ画面が表示される。

ふう、今回は一回書き直したのでえらく大変だった...
次回にプロパティエディタのドロップダウン形式を扱う事にする。

« プロパティエディタの指定 | トップページ | 独自のプロパティエディタ作成(ドロップダウン形式) »

C# Tips」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1412251/36927579

この記事へのトラックバック一覧です: 独自のプロパティエディタ作成(ダイアログボックス形式):

« プロパティエディタの指定 | トップページ | 独自のプロパティエディタ作成(ドロップダウン形式) »