- PR -

WEBサーバコントロール作成時に子コントロールを複数作成するには

1
投稿者投稿内容
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-10-29 14:43
ASP.NET(VB.NET)にてWEBカスタムコントロールを作成しています。

作成しているのは、
・DropDownListコントロールを継承するコントロール
・新しくコレクションタイプのプロパティを追加し、子コントロールとする
といったものです。

まず、新しくプロパティを追加して、それを子コントロールとするところまではできました。

コード:
※PocketColorCollectionはCollectionBaseクラスを継承するコレクションクラスです。

<ParseChildren(True, "BorderValues"), ToolboxData("<{0}:MyDropDownList runat=server></{0}:MyDropDownList>")> _
Public Class MyDropDownList
    Inherits WebControls.DropDownList

    Private _childitems As New PocketColorCollection

    <MergableProperty(False), _
    PersistenceMode(PersistenceMode.InnerDefaultProperty)> _
    Public ReadOnly Property BorderValues() As PocketColorCollection
        Get
            Return _childitems
        End Get
    End Property


End Class



しかし、こうするとDropDownListクラスのItemsプロパティである<asp:ListItem>も
PocketColorCollectionと認識されてしまい、解析エラーとなります。

ParseChildrenではひとつのプロパティしか子コントロールとして指定できませんし、
これを回避するのはどうすればよいでしょうか?

どなたかよい知恵をお貸しください。m(__)m
soramimi
会議室デビュー日: 2003/10/29
投稿数: 19
投稿日時: 2003-10-29 17:51
次のように変更してみてはどうでしょうか。

1. ParseChildren(True, "BorderValues") -> ParseChildren(True)

2. PersistenceMode(PersistenceMode.InnerDefaultProperty)
->PersistenceMode(PersistenceMode.InnerProperty)

3. DropDownList の Items プロパティをオーバーライドして
PersistenceMode(PersistenceMode.InnerProperty) を付ける。



なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-10-30 09:11
soramimiさん、ありがとうございます。

さっそく試してみましたができました!!
しかしもうひとつ気になることが…。

コード:
<BorderValues>
    <cc1:PocketColor MinValue="0" Color="255, 128, 128" MaxValue="0"></cc1:PocketColor>
</BorderValues>
<Items>
    <asp:ListItem Value="1">1</asp:ListItem>
</Items>



これで生成されたHTMLを見ると上記のようになっていますが、<BorderValues>
と<Items> <asp:ListItem>に赤線がついて「アクティブになっているスキーマは
要素' BorderValues'をサポートしません。」と表示されています。

これは何なのでしょうか?
実行には問題ないのですが、解決できるなら解決したいです。
soramimi
会議室デビュー日: 2003/10/29
投稿数: 19
投稿日時: 2003-10-30 13:16
実は私も気になっていましたが解決できていません。
ただサードパーティ製の良く出来ているカスタムサーバーコントロール
を使ってみてもやっぱり赤線で指摘されているので、私の中ではもともと
あるサーバーコントロール以外はそういうものだ、と思ってます。
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-10-30 13:40
特に動作には支障がないのなら放っておいてもよさそうですね。

これで完成!
と思って画面にいろいろと配置していくと…。
なぜかDataGridのテンプレートカラムにこのコントロールを配置すると、デザイン時に
「コントロールを描画中にエラーが発生しました。」と表示されてしまい、
DataGridが表示されなくなってしまいました…。

実行するとちゃんと表示されるのですが、原因は何が考えられますでしょうか?
soramimi
会議室デビュー日: 2003/10/29
投稿数: 19
投稿日時: 2003-10-30 14:11
Render メソッドで例外が発生していませんか?
例外をキャッチしてメッセージを出力するようにコードを
変更してみてください。

例外が発生していても単独で配置した場合はエラーではなく
[MyServerControl "MyServerControl1"] などと表示されるようです。
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-10-30 15:15
try〜catchして出力してみたら原因がわかりました。
どうやらキャストに失敗していたようえす。(^^;

DataGrid内だけ…というのは、DBの値を連結させていたため、
連結されていないデザイン時にエラーになるという理由でした。

どうもありがとうございました。m(__)m
1

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