DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザーコントロールの作成について

環境/言語:[.NET Framework3.5 ]
分類:[ASP.NET]

VS2008 C# にてWeb用のユーザーコントロールを作成しております。

ユーザーコントロールのWebのページに貼り付けてデザイナでプロパティ
を変更したらマークアップの方にも反映させたいのですが、どうですれば
よいかご教示願います。
それとも自分で入力して追加するしかないのでしょうか?
■No28394に返信(ASP.NET素人さんの記事)

> ユーザーコントロールのWebのページに貼り付けて
何を貼り付けるのでしょうか?


> デザイナでプロパティ
> を変更したらマークアップの方にも反映させたいのですが、どうですれば
> よいかご教示願います。
> それとも自分で入力して追加するしかないのでしょうか?
デザイナで設定された内容はそのままascxファイルに書かれると思いますが
そうなりませんか?
■No28401に返信(shuさんの記事)
> ■No28394に返信(ASP.NET素人さんの記事)
>
>>ユーザーコントロールのWebのページに貼り付けて
> 何を貼り付けるのでしょうか?

独自に数字しか入力できないようにしたTextBoxをユーザーコントロールを作成
しWebのページに貼り付けております。

>
>>デザイナでプロパティ
>>を変更したらマークアップの方にも反映させたいのですが、どうですれば
>>よいかご教示願います。
>>それとも自分で入力して追加するしかないのでしょうか?
> デザイナで設定された内容はそのままascxファイルに書かれると思いますが
> そうなりませんか?

はい、残念ながらascxファイルに追加されません。

抜粋ですが
@クラスの先頭部分
[DefaultProperty( "Text" )]
[ToolboxData( "<{0}:FWTextBoxNumeric runat=server></{0}:FWTextBoxNumeric>" )]
public partial class FWTextBoxNumeric : TextBox
{
    ・・・

Aプロパティの部分
[Category( "カスタム" )]
[Description( "IMEモードを指定します。" )]
[DefaultValue( typeof( ImeModeList ), "disabled" )]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
public ImeModeList ImeMode
{
get { return this._imeMode; }
set { this._imeMode = value; }
}

何か指定不足なのでしょうか?
ご教授願います。
■No28404に返信(ASP.NET素人さんの記事)

> 抜粋ですが
> @クラスの先頭部分
> [DefaultProperty( "Text" )]
> [ToolboxData( "<{0}:FWTextBoxNumeric runat=server></{0}:FWTextBoxNumeric>" )]
> public partial class FWTextBoxNumeric : TextBox
> {
>     ・・・
>
> Aプロパティの部分
> [Category( "カスタム" )]
> [Description( "IMEモードを指定します。" )]
> [DefaultValue( typeof( ImeModeList ), "disabled" )]
> [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
> public ImeModeList ImeMode
> {
> get { return this._imeMode; }
> set { this._imeMode = value; }
> }
>
> 何か指定不足なのでしょうか?
> ご教授願います。
これはデザイナの話ではないですが、このユーザコントロールをaspxに貼り付けて
aspxのデザイナ表示で作成されたImeModeのプロパティを設定されているということでしょうか?とすると書かれる場所はaspxの方になるかと。プログラムに書かれた内容はdllの中になってしまいます。
■No28405に返信(shuさんの記事)
> ■No28404に返信(ASP.NET素人さんの記事)
>
>>抜粋ですが
>>@クラスの先頭部分
>> [DefaultProperty( "Text" )]
>> [ToolboxData( "<{0}:FWTextBoxNumeric runat=server></{0}:FWTextBoxNumeric>" )]
>> public partial class FWTextBoxNumeric : TextBox
>> {
>>    ・・・
>>
>>Aプロパティの部分
>> [Category( "カスタム" )]
>> [Description( "IMEモードを指定します。" )]
>> [DefaultValue( typeof( ImeModeList ), "disabled" )]
>> [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
>> public ImeModeList ImeMode
>> {
>> get { return this._imeMode; }
>> set { this._imeMode = value; }
>> }
>>
>>何か指定不足なのでしょうか?
>>ご教授願います。
> これはデザイナの話ではないですが、このユーザコントロールをaspxに貼り付けて
> aspxのデザイナ表示で作成されたImeModeのプロパティを設定されているということでしょうか?とすると書かれる場所はaspxの方になるかと。プログラムに書かれた内容はdllの中になってしまいます。
>

言葉足らずですみません。
抜粋したソースは、dllにしたユーザーコントロール内のソースです。

aspのデザイナでユーザーコントロールを追加すると
以下のコードが追加されます。
<cc1:FWTextBoxNumeric ID="FWTextBoxNumeric1" runat="server"></cc1:FWTextBoxNumeric>

その後、デザイナ上でImeModeを変更しても
ImeMode="XXX"が追加されないのです。

追加されるようにするにはユーザーコントロール側で記述しなければいけないコードが他にあるでしょうか?

があるのでしょうか
■No28417に返信(ASP.NET素人さんの記事)

ユーザーコントロールはUserControlクラスの派生クラスで、ascxファイルのことを
言います。ASP.NET素人さんの言われているFWTextBoxNumericはTextBoxコントロール
の派生クラスで、カスタムコントロールと言います。

ASP.NET素人さんとshuさんのやり取りを拝見しますと、ASP.NET素人さんはページに
カスタムコントロールを配置し、デザイナのプロパティでカスタムコントロールのマ
ークアップを編集したいということですか。

Integer型、String型のプリミティブ型のプロパティであれば、クラスにプロパティ
を用意するだけで、デザイナのプロパティでマークアップを編集するようにできます
よね。今回はImeModeList型のプロパティがあるということですね。ImeModeListとい
う名称から推測するとコレクションでしょうか。

ImeModeListのオブジェクトをプリミティブ型で公開するようにするとよいのではな
いでしょうか。

public String ImeMode {
  get {
    return String.Join("," , this._imeMode.ToArray());
  }
  set {
    this._imeMode.Add(String.Split ...
  }
}

あるいはImeModeList型とString型の変換を行うTypeConverterクラスの派生クラスを
作成し、TypeConverterAttributeで関連付けるというやり方も考えられます。

[TypeConverter(typeof(ImeModeListConverter))]
public ImeModeList ImeMode
{
  get { return this._imeMode; }
  set { this._imeMode = value; }
}

class ImeModeListConverter : TypeConverter {
  public override bool CanConvertFrom(ITypeDescriptorContext context,
      Type sourceType) {
    return sourceType == typeof(string);
  }
  public override object ConvertFrom(ITypeDescriptorContext context,
      CultureInfo culture, object value) {
    return new ImeModeList((string)value);
  }
  public override object ConvertTo(ITypeDescriptorContext context,
      CultureInfo culture, object value, Type destinationType) { 
    return string.Join(",", ((ImeModeList)value).ToArray());
  } 
}

コードはイメージでしかありません。ご注意ください。
shuさん、もりおさんありがとうございました。

もりおさんのやり方に習いソースを変更し
マークアップを表示した状態でプロパティを編集するとカスタムコントロールのマ
ークアップが追加されるようになりました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板