- - PR -
Webカスタムコントロールに子コントロールを追加したい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 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-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