none
Express Edition で ユーザー インターフェイス型エディタは実装できますか? RRS feed

  • 質問

  • いつも参考にさせて頂いてます。
    VB.NET暦2年、ASP.NET暦半年くらいになりましたVisual練習生と申します。
    Visual Web Developer 2008、VB.NET です。

    私は今とあるアプリケーションのWebマニュアルを作成しているのですが、
    それには操作手順のスクリーンショットを多用する場面が出てきます。

    これに関して、画像の下にキャプションを付けて表示したいのですが、
    毎回ImageとLabelを二つ用意するのは面倒なので、URLとキャプション文字列を
    設定するだけで済むWebカスタムコントロールを作ろうとしています。

    そのコントロールにはURLのプロパティを持たせているのですが、
    デザイン時にURL文字列を手入力するのは非効率なので、
    ユーザーインターフェイス型エディタ(という呼び方であっているのでしょうか?)で
    イメージファイルを選択させたく考えています。

    例えばImageコントロールのImageURLはデザイン時に「イメージの選択ダイアログ」を使って選択できます。
    ImageURL自体はただのString型なので、何らかのカラクリがあるはずだと考えています。

    以上の予想の元、~.Design名前空間のMSDNドキュメントの目次を眺めていると、
    System.Web.UI.Design.ImageUrlEditor クラス
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.design.imageurleditor.aspx
    に以下のサンプルコードを見つけました。

    <EditorAttribute(GetType(System.Web.UI.Design.ImageUrlEditor), GetType(UITypeEditor))> _
    Public Property imageURL() As String

    しかし、試してみたのですが、
    「'System.Web.UI.Design.ImageUrlEditor' が定義されていません。」
    というエラーが出てコンパイルできませんでした。

    参考になりそうな私の環境情報としては、Imports System.Web.UI.Design はエラーは出ませんでした。
    Imports System.Web.UI.Design.WebControlsは名前空間または型が見つかりませんエラーでした。
    My Project→参照→参照設定→追加→.NETタブのコンポーネント一覧には、System.Web.UIは出ていません。
    System.Webは出ており、参照にも含まれています。

    コンパイルのやり方が分かる方がいらっしゃいましたらアドバイスをお願い致します。よろしくお願いします。

    2009年3月14日 11:58

回答

  • リンク先のページにはさりげなく「アセンブリ : System.Design (System.Design.dll 内)」と書かれています。
    つまり参照にSystem.Design.dllを追加すればコンパイルできるようになります。

    このことを理解した上で。デザイン時にだけSystem.Design.dllが必要で、コントロールの実行時には本来不要です。
    不要なモジュールをロードするのは無駄なことであり、その対策も用意されています。
    EditorAttributeの第1引数はType型だけでなくString型も受け付けます。
    つまり

    <EditorAttribute("System.Web.UI.Design.ImageUrlEditor, System.Design", GetType(UITypeEditor))>

    と書くことで実行時にはStringであり参照は不要になり、デザイン時に文字列を解析してDLLをロードすることができるようになります。
    パフォーマンスを求めなければ、どちらを選択してもかまいません。

    2009年3月14日 14:02

すべての返信

  • 自己レスになります。

    1時間半ほど散歩に行ってリフレッシュしたら、思いつきました。
    System.Designを参照に追加したらImportsエラーがなくなりました。おおぉ・・・

    何とかなりそうな気がしてきました。とりあえずご報告まで。
    2009年3月14日 13:52
  • リンク先のページにはさりげなく「アセンブリ : System.Design (System.Design.dll 内)」と書かれています。
    つまり参照にSystem.Design.dllを追加すればコンパイルできるようになります。

    このことを理解した上で。デザイン時にだけSystem.Design.dllが必要で、コントロールの実行時には本来不要です。
    不要なモジュールをロードするのは無駄なことであり、その対策も用意されています。
    EditorAttributeの第1引数はType型だけでなくString型も受け付けます。
    つまり

    <EditorAttribute("System.Web.UI.Design.ImageUrlEditor, System.Design", GetType(UITypeEditor))>

    と書くことで実行時にはStringであり参照は不要になり、デザイン時に文字列を解析してDLLをロードすることができるようになります。
    パフォーマンスを求めなければ、どちらを選択してもかまいません。

    2009年3月14日 14:02
  • アドバイスありがとうございます。

    「アセンブリ」にしっかり書かれていたのですね。
    アセンブリについてよく分からなかったので、読み飛ばしていました(汗)

    それからEditorAttributeの件、勉強になります。
    今回はパフォーマンスは求めていませんが、不要なモジュールをロードする必要性もありませんので、
    こちらの方法で実装しようかと思います。

    ちなみにカスタムコントロールは無事コンパイルでき、デザイン時にダイアログが出てきてくれました。
    ありがとうございました!

    2009年3月14日 16:37