none
Webユーザーコントロール(ascx)へコントロール属性を付与する件について RRS feed

  • 質問

  • お世話になっております。

    VisualStudio2008で、Webアプリケーション(ASP.NET (3.5))を作成しています。
    「Webサイト」に、Webユーザーコントロール(ascx)を作成して
    同じWebサイトにあるWebフォーム(aspx)で利用しています。

    作成したascxのクラスへ System.ComponentModel名前空間の属性をいくつか付与したのですが、
    効果がない(つけてもつけなくても変化がない?)ような状況です。

    DefaultPropertyAttribute
    「既定のプロパティ」とは、aspx上においてタグではさんだ値を取り込んだりするものと解釈しておりました。
    しかし、この属性で既定のプロパティを指定しても、エラーになってしまいます。

    例: <uc1:myuc runat="server">data</uc1:myuc>
    IDE上で「リテラルの内容('data')は、System.Web.UI.Control内では使用できません。」と表示されてしまいます。

    解釈は間違っているのでしょうか?別の方法で行うのでしょうか?
    またDefaultPropertyAttributeには、どんな効果があるのでしょうか?


    DefaultEventAttribute
    「既定のイベント」とは、デザインビューで作成したコントロールをダブルクリックすると、コードビューへ既定で作られるイベントハンドラを指定できるものと解釈しておりました。
    しかし、コントロールをダブルクリックしても何も反応がありません。(Form_Loadのスケルトンコードすら作成されません)

    解釈は間違っているのでしょうか?別の方法で行うのでしょうか?
    そもそもDefaultEventAttributeには、どんな効果があるのでしょうか?

    <System.ComponentModel.DefaultProperty("SelectedValue")> _
    <System.ComponentModel.DefaultEvent("SelectedValueChanged")> _
    Partial Class WebControls_Myuc
        Inherits System.Web.UI.UserControl
        
        Public Event SelectedValueChanged()
        
        Public Property SelectedValue() As String
            Get
                    
            Set(ByVal value As String)
    ・・・
    ご存知の方、ご教示のほどお願い致します。
    2009年11月5日 7:19

すべての返信

  • > 「Webサイト」に、Webユーザーコントロール(ascx)を作成して

    Web カスタムコントロール (.vb または .cs) ではなくて、Web ユーザーコントロール (.ascx) に間違いない
    ですか?  アップされていたコードは後者のように見えましたが?


    すみません、誤記訂正です。

    誤: アップされていたコードは後者のように見えましたが?
                  ↓
    正: アップされていたコードは前者のように見えましたが?

    Web ユーザーコントロールでクラスを定義することはないと思うのですが(自分が知らないだけ?)。
    • 編集済み SurferOnWww 2009年11月7日 6:53 誤記訂正
    2009年11月6日 14:32
  • SurferOnWww様

    有難う御座います。
    正確には、Webユーザーコントロール(ascx)の分離コード部分(.vb または .cs)になります。
    ソリューションエクスプローラでのファイル名は、-----.ascx.vb と表示されています。

    恐れ入りますが、宜しくお願い致します。

    2009年11月7日 17:39
  • ちょっと調べてみましたが、DefaultPropertyAttribute と DefaultEventAttribute によって、Visual
    Studio 2008 が「タグではさんだ値を取り込んだり」「ダブルクリックすると、コードビューへ既定で作ら
    れるイベントハンドラを指定」することはないようです。

    以下のサイトによると、表示が強調されるようなことが書いてありましたが、それもなかったです。

    Visual Studio .NET プロパティ ブラウザによるコンポーネントの本格的な RAD 化
    http://msdn.microsoft.com/ja-jp/library/aa302334.aspx

    ただし、プロパティ値の設定や、ハンドラの入れ物の自動生成はできます。(DefaultPropertyAttribute
    と DefaultEventAttribute の有無に関係なく)

    例えば、以下のような Web ユーザーコントロールを作ってページに配置し、それにフォーカスを当てる
    とプロパティウィンドウに UserName が表示されます。それに HogeHoge と設定するとソース画面上の
    <xxx:MyButton ... タグ内に UserName="HogeHoge" というコードが自動的に追加されます。

    また、ソース画面の右上のロップダウンリスト中の MyButtonClicked をクリックすると <xxx:MyButton ...
    タグ内に OnMyButtonClicked="MyButton1_MyButtonClicked" というコードが自動生成され、さらに、
    protected void MyButton1_MyButtonClicked(object sender, EventArgs e) というハンドラが追加さ
    れます。

    お試しください。

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    public partial class MyWebUserControl : System.Web.UI.UserControl
    {
        public string UserName
        {
            get
            {
                object obj = ViewState["UserName"];
                return (obj != null) ? (string)obj : "no user name";
            }
            set
            {
                ViewState["UserName"] = value;
            }
        }

        public event EventHandler MyButtonClicked
        {
            add
            {
                Button1.Click += value;
            }
            remove
            {
                Button1.Click -= value;
            }
        }
    }

    (注)上記はコードビハインド(.ascx.cs ファイル)側。 .ascx 側は Button コントロール一個のみです。

    2009年11月8日 6:43
  • SurferOnWww様

    どうも有難う御座います。
    わざわざコードまで作っていただきまして恐れ入ります。

    プロパティウインドウでプロパティへ値を指定したときに、タグの属性として登録されること(UserName="HogeHoge")と、
    右上のドロップダウンリストからイベントを選択したときに、ハンドラのスケルトンが生成されるのは、
    どんなコントロールにおいても既定の動作になります。

    コードビューではなくデザインビュー上でコントロールをダブルクリックしたときに、ハンドラがコード上に現れるとよいのですが...
    たとえば標準のASP:TextBoxであれば、デザインビュー上のテキストボックスをダブルクリックするとTextChangedハンドラが生成されるのです。

    もしかして、ユーザーコントロールでは無理なのかもしれません・・・
    2009年11月10日 17:32
  • > どんなコントロールにおいても既定の動作になります。

    「既定」とのことですが、Microsoft の Web や Visual Studio ドキュメントなどに規定されているの
    でしょうか? 自分が探した限りでは、見つけられませんでした。よろしければ、どこに書いてあるか
    教えていただけないでしょうか?

    2009年11月11日 12:30
  • ユーザーコントロールを追加すれば
    ソリューションエクスプローラ上に、普通に出来ます。

    +ソリューション 'solution name' (1プロジェクト)
    - C:\...\Project\
    - sample.aspx
       - sample.aspx.vb   <-

    自動的に出来るのですが・・・(既定:デフォルト。規定ではないです)
    出来ないようでしたら、ちょっとエディションなど違うのかもしれませんので・・・

    この方のブログの一番下にも、ユーザコントロール(ascx)にascx.cs といった名で作られています。
    ascx ファイルを展開するための準備 の項)
    http://crie-illuminate.spaces.live.com/?_c11_BlogPart_pagedir=Next&_c11_BlogPart_handle=cns!2FF2FFB723A043DA!520&_c11_BlogPart_BlogPart=blogview&_c=BlogPart

    これでも、自動で生成されるのはありえないとのことでしたら
    VS上でのオプションか何かの設定が違うのかもしれません。
    折角のところ残念ですが、他の方からのご回答をお待ちしたいと思います。

    2009年11月18日 5:18
  • > 自動的に出来るのですが・・・(既定:デフォルト。規定ではないです)
    > 出来ないようでしたら、ちょっとエディションなど違うのかもしれませんので・・・

    どうも話がすれ違っているようです。

    二つ目のレスで書いたとおり、実際に試してみればそのようになることは自分も知っています。

    「どんなコントロールにおいても既定の動作になります。」と言い切っておられるので、Microsoft の
    公式文書に書いてあるなど、それなりの確証をお持ちであろうと思いました。だから、どこに書いてあ
    るのかお聞きしたしだいです。

    それが見つけられなければ、実際に試してみた結果で納得するほかないと思います。


    -----------------------------------
    補足 2009/11/19

    後で上のレスを読み返してみると、舌足らずかつかなりズレていたのに気が
    つきましたので、補足させてください。

    Visual Studio のソリューションエクスプローラに、どのように aspx や
    aspx.vb が表示されるかの話をしているわけではありませんので、誤解の
    無いようにお願いします。(以前からそのような話は一切していません)

    以下の DEKOCHAN さんのメッセージのようなことが Microsoft の公式文書
    に書いてあるのをご存知であれば、どこに書いてあるのか教えてほしいと
    いう話です。

    > プロパティウインドウでプロパティへ値を指定したときに、タグの属性と
    > して登録されること(UserName="HogeHoge")と、右上のドロップダウンリ
    > ストからイベントを選択したときに、ハンドラのスケルトンが生成される
    > のは、どんなコントロールにおいても既定の動作になります。

    • 編集済み SurferOnWww 2009年11月19日 13:06 補足
    2009年11月18日 13:22