- PR -

Webカスタムコントロールに子コントロールを追加したい

1
投稿者投稿内容
モカ
会議室デビュー日: 2004/08/04
投稿数: 3
投稿日時: 2004-08-04 15:44
初めて投稿します。
よろしくお願いします。

ASP.NET(C#)でWebカスタムコントロールを作成しています。
作成したいコントロールは以下のようなものです。(少し簡略化します。)
(1)複数の子コントロールを持つ。
(2)プロパティのコレクション(コレクションエディタ)で(1)の子コントロールを追加する。
子コントロールのプロパティも一緒に設定できる。

調べながらコーディングしたところ、ある程度まで実装できたのですが、
実行時に「あいまいな一致が見つかりました。」とエラーになります。

子コントロールを追加した際のHTML表示です。
*****
<cc1:MyControl id="MyControl1" runat="server">
<Items>
<cc1:MyItem ID="MyItem1"></cc1:MyItem>
</Items>
</cc1:MyControl>
*****

(1)WebコントロールのHTMLタグで、子コントロールを入れ子で表示できているのですが、
<Items></Items>で上記のようなエラーになるのですが、解決方法がわかりません。

(2)コレクションエディタで子コントロールを追加すると、
HTMLタグでMyItemが追加されますが、オブジェクトが追加されるタイミングがわかりません。自分で実装する必要があるのでしょうか?

ご存知の方がいらっしゃいましたら、ご教授願います。

以下に実装を記述します。
(必要ではなさそうなソースは省略しました。)
*******
WebカスタムコントロールはWebControlを継承したMyControlとし、
子コントロールを保持するクラスとしてArrayListを継承したMyCollectionを作成、
子コントロールはWebControlを継承したMyItemとしています。

[ParseChildren(true)]
public class MyControl : WebControl
{
private MyCollection items = new MyCollection();

[MergableProperty(false)]
[PersistenceMode(PersistenceMode.InnerProperty)]
public MyCollection Items
{
get
{
return items;
}
set
{
items = value;
}
}

protected override void Render(HtmlTextWriter writer)
{
//WebカスタムコントロールのHTML出力と
//MyCollectionのMyItemのRender処理を行います。
}
}

public class MyCollection : ArrayList
{
public new MyItem this[int index]
{
get
{
return this[index];
}
set
{
this[index] = value;
}
}

public void AddRange(Tab[] obj)
{
base.AddRange(obj);
}
}

public class MyItem : WebControl
{
public void RenderContents(HtmlTextWriter writer)
{
//MyControlのRenderで実行されるRender処理
}
}

よろしくお願いします。
モカ
会議室デビュー日: 2004/08/04
投稿数: 3
投稿日時: 2004-08-04 15:49
すみません。
MyCollectionクラスのインデクサに属性を記述するのを忘れました。

*****
public class MyCollection : ArrayList
{

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor(typeof(System.ComponentModel.Design.CollectionEditor), typeof(System.Drawing.Design.UITypeEditor)) ]
public new MyItem this[int index]
{
get
{
return this[index];
}
set
{
this[index] = value;
}
}
モカ
会議室デビュー日: 2004/08/04
投稿数: 3
投稿日時: 2004-08-06 10:15
自己解決です。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7156&forum=7
このスレッドを見て解決できました。

詳しい理由はわかりませんが、
MyCollectionクラスをArrayListではなく、CollectionBaseクラスを継承させることで、<Items></Items>のあいまいな一致によるエラーがでなくなりました。
(他にも余計な属性は削除しました。)

ただ、新しく問題がでました。
ツールボックスよりコントロールを貼り付け、コレクションエディタで子コントロールを追加した場合、
デザイン表示でRender通りの表示がされるのですが、
一度プロジェクトを閉じて、再度開いた場合にコントロールの作成エラーとなってしまいます。
内容としては「''をプロパティ'Items"で設定できませんでした。」となります。

<cc1:MyItem>が設定できないといわれているような気をするのですが・・・。

この状態で実行すると、きちんと実行され正しく表示されます。
デザインできちんと表示される方法をご存知の方がいましたら、ご教授ください。
1

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