- PR -

カスタム複合コントロール作成につきまして

1
投稿者投稿内容
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-04-11 16:01
毎々大変お世話になっております。

題記の件、ご質問をさせて頂きます。

現在、TABLEコントロール・REPEATERコントロールを内包した
複合コントロールを作成しています。

イメージ的には下記のような感じです。

=================================================================
<CUSTOM:FUKUGOUCONTROL ID="FUKUGOUCONTROL1" RUNAT="server">
<ASP:REPEATER ID="Repeater1" RUNAT="server">
 <ITEMTEMPLATE>
  <ASP:TABLE ID="Table1" RUNAT="server" >
   <ASP:TABLEROW>
    <ASP:TABLECELL>AAA</ASP:TABLECELL>
    <ASP:TABLECELL>BBB</ASP:TABLECELL>
   </ASP:TABLEROW>
   <ASP:TABLEROW>
    <ASP:TABLECELL>CCC</ASP:TABLECELL>
    <ASP:TABLECELL>DDD</ASP:TABLECELL>
   </ASP:TABLEROW>
  </ASP:TABLE>
 </ITEMTEMPLATE>
</ASP:REPEATER>
</CUSTOM:FUKUGOUCONTROL>
=================================================================

現在、デザイン時にHTMLを確認すると
上記のような文字列を出力するように定義しています。
※出力する処理は当複合コンとロールのデザインクラス内の
 GetPersistInnerHtmlメソッドで行っています。
しかし、実行時に
下記の通りのエラーメッセージが出力されてしまいます。

「型 FUKUGOUCONTROL に
ASP:REPEATER という名前のプロパティは存在しません。」

上記現象の回避策等をご存知の方がいらっしゃいましたら、
ご教授の程、宜しくお願い致します。

以上


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-11 22:23
> 「型 FUKUGOUCONTROL に
> ASP:REPEATER という名前のプロパティは存在しません。」
この通りでしょう。

 ところで、参照記事が、URIが途中で切れているので参照できません。
ASP.NET サーバー コントロール開発の基本
複合サーバー コントロールのサンプル
この辺りかな?用語は、MSDNに出てくるものと、極力あわせてください。「カスタム」コントロールには、サーバーコントロールとユーザーコントロールがあります。複合が付くから、サーバーコントロールでしょうけど。

 それで、『上記のような文字列を出力するように』、どのように定義しましたか?なんとなく、InnerHTMLに、"<ASP:REPEATER..."と書くようなコーディングをしていると判断したのですが。
 まぁ、『複合サーバー コントロールのサンプル』を、よく見てください。そんなことしてないはず。また、そんなコーディングをしなければならないのなら、面倒くさくて使ってられません。


 あと、@ITで投稿時にエラーが出ても、投稿が受け付けられて、それを読み出すときにエラーになる確率が高いです。一度別のウインドウを開いて、投稿が受け付けられているか確認することをお勧めします。
 また、30分以内であれば削除することも出来ますので、利用してください。

_________________
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-04-12 09:20
何をしたいのかがわからないので想像ですが、子エレメントをプロパティでなくコントロールとして解釈させたいのなら
コード:
[ParseChildren(false)]


でいいのかもしれません。
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-04-13 16:49
貴重なご意見ありがとうございます。

Jittaさん、ご指摘の通り、
InnerHTMLに直接文字列を書いていました。
これは、GetPersistInnerHtmlを参考に改善させて致しました。

お忙しい中申し訳ございませんが、
更に質問させて頂きたいと思います。

目的:カスタムコントロール内部にTable型のプロパティを
    用意し、カスタムコントロールの一部としてテーブルを扱いたい。

この際、記述は下記の通りになると思います。

------------------------------------------------
public class CustomControl: WebControl, INamingContainer
{
  public Table _table = new Table();
  public Table TableProperty
  {
   get
   {
    return _table;
   }

   set
   {
    return _table;
   }

}

------------------------------------------------

上記の通り記述し、IDE上で確認すると確かに
TablePropertyプロパティのサブプロパティとして
Tableコントロールのプロパティが表示され、
設定も可能です。
しかし、実行時に、上記オブジェクトを
参照するとIDEで設定した内容は何も反映されていません。
※IDE上列・行を増やした際は、IDEのHTMLには反映されます。

上記問題の解決方法をご存知の方がいらっしゃいましたら
ご教授の程、宜しくお願い致します。

以上
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-04-13 17:18
TablePropertyに
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
属性を追加してみてください。
たなすぺ
常連さん
会議室デビュー日: 2003/06/23
投稿数: 35
投稿日時: 2005-04-15 09:45
にしざきさん、ご意見ありがとうございます。

結果を申し上げますと、下記の通り@を追加すると
子要素として認識され、HTMLに出力されます。
※但し、<ASP:TABLE ID="Table1" RUNAT="server" > タグを
 HTMLに含めると解析エラーとなるため、
 デザイン時には<ASP:TABLEROW>からHTMLに出力するようにしました。
 (解析エラーになるのは、デザイン時も実行時も同様です。)
------------------------------------------------
[ParseChildren(true)] ← @ココを追加
public class CustomControl: WebControl, INamingContainer
{
  public Table _table = new Table();
  public Table TableProperty
  {
   get
   {
    return _table;
   }

   set
   {
    return _table;
   }

}

------------------------------------------------

以上が、現状報告となります。

で、更に質問を致します。
現状下記の通りにデザイン時にHTMLを生成しております。

=================================================================
<CUSTOM:FUKUGOUCONTROL ID="FUKUGOUCONTROL1" RUNAT="server">
 <TEMPLATE_HEADER>
   <ASP:TABLEROW>
    <ASP:TABLECELL>AAA</ASP:TABLECELL>
    <ASP:TABLECELL>BBB</ASP:TABLECELL>
   </ASP:TABLEROW>
 </TEMPLATE_HEADER>
 <TEMPLATE_FOOTER>
   <ASP:TABLEROW>
    <ASP:TABLECELL>CCC</ASP:TABLECELL>
    <ASP:TABLECELL>DDD</ASP:TABLECELL>
   </ASP:TABLEROW>
 </TEMPLATE_FOOTER>
</CUSTOM:FUKUGOUCONTROL>
=================================================================
<TEMPLATE_HEADER>及び<TEMPLATE_FOOTER>はテンプレートとして
定義しております。
この状態で実行をしますと、下記のように出力されてしまいます。
※<TABLE>タグは実行時に出力するようにしています。
=================================================================
<span id="FUKUGOUCONTROL1" >
<TABLE>
<ASP:TABLEROW>
<ASP:TABLECELL>AAA</ASP:TABLECELL>
<ASP:TABLECELL>BBB</ASP:TABLECELL>
</ASP:TABLEROW>
</TABLE>
<TABLE>
<ASP:TABLEROW>
<ASP:TABLECELL>CCC</ASP:TABLECELL>
<ASP:TABLECELL>DDD</ASP:TABLECELL>
</ASP:TABLEROW>
</TABLE>
</span>
=================================================================

テンプレートに含めた下記の要素をHTMLに変換するには
何が必要なのでしょうか?
<ASP:TABLEROW>
 <ASP:TABLECELL>CCC</ASP:TABLECELL>
 <ASP:TABLECELL>DDD</ASP:TABLECELL>
</ASP:TABLEROW>

ちなみに、テンプレートは下記のように定義しております。

private ITemplate Header_Template;

[PersistenceMode(PersistenceMode.InnerProperty), Browsable(false), DefaultValue((string) null), TemplateContainer(typeof(RepeaterItem))]
public ITemplate TEMPLATE_HEADER
{
get
{
return this.Header_Template;
}
set
{
this.Header_Template= value;
}
}

お忙しい中申し訳ございませんが、
ご存知の方がいらっしゃいましたら、ご教授の程
宜しくお願い致します。

以上
1

スキルアップ/キャリアアップ(JOB@IT)