- PR -

カスタムコントロール内のプロパティが初期化されてしまう。

1
投稿者投稿内容
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2003-12-18 23:54
なかむらです。

ASP.NETでPanelコントロールを子コントロールを持つカスタムコントロールを作成しているのですが、
そのコントロールが持つほかのプロパティを変更すると、なぜかPanelコントロールが消えてしまいます。

コード:
<ParseChildren(True), DefaultProperty("Title"), _
 ToolboxData("<{0}:MyMessageControl runat=server></{0}:MyMessageControl>")> _
Public Class MyMessageControl
    Inherits System.Web.UI.WebControls.WebControl

    Private _MessageControl As New Panel

    Public Sub New()
        MyBase.New()

        [Width] = WebControls.Unit.Pixel(300)
        [BackColor] = System.Drawing.Color.FromArgb(&HFFFFCC)
        [Title] = "タイトルを設定してください"

    End Sub

    <Bindable(True), Category("Appearance"), DefaultValue("")> _
    Property [Title]() As String
        Get
            Return CType(ViewState("Title"), String)
        End Get

        Set(ByVal Value As String)
            ViewState("Title") = Value
        End Set
    End Property

    <PersistenceMode(PersistenceMode.InnerProperty)> _
    Public Property MessageControl() As Panel
        Get
            Return _MessageControl
        End Get
        Set(ByVal Value As Panel)
            _MessageControl = Value
        End Set
    End Property

    Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)

        Try

            If [Visible] = True Then
                Dim htmlDiv1 As HtmlGenericControl = New HtmlGenericControl("DIV")
                Dim htmlDiv2 As HtmlGenericControl = New HtmlGenericControl("DIV")
                Dim htmlDiv3 As HtmlGenericControl = New HtmlGenericControl("DIV")
                Dim htmlDiv4 As HtmlGenericControl = New HtmlGenericControl("DIV")
                Dim htmlDiv5 As HtmlGenericControl = New HtmlGenericControl("DIV")
                Dim uc As New UnitConverter
                Dim wc As New WebColorConverter

                htmlDiv1.Style.Add("border-top", "#999999 1px solid")
                htmlDiv1.Style.Add("border-right", "#666666 1px solid")
                htmlDiv1.Style.Add("border-left", "#666666 1px solid")
                htmlDiv1.Style.Add("border-bottom", "#666666 1px solid")
                htmlDiv1.Style.Add("width", uc.ConvertToString(Me.Width))

                htmlDiv2.Style.Add("border-top", "#ffffff 1px solid")
                htmlDiv2.Style.Add("border-right", "#999999 1px solid")
                htmlDiv2.Style.Add("border-left", "#ffffff 1px solid")
                htmlDiv2.Style.Add("border-bottom", "#999999 1px solid")

                ' タイトル領域
                htmlDiv3.Style.Add("padding-top", "3px")
                htmlDiv3.Style.Add("padding-right", "3px")
                htmlDiv3.Style.Add("padding-left", "3px")
                htmlDiv3.Style.Add("padding-bottom", "4px")
                htmlDiv3.Style.Add("background-color", "#cccccc")
                htmlDiv3.Style.Add("text-align", "left")
                htmlDiv3.InnerText = [Title]

                htmlDiv4.Style.Add("border-top", "#999999 1px solid")
                htmlDiv4.Style.Add("border-right", "#cccccc 1px solid")
                htmlDiv4.Style.Add("border-left", "#999999 1px solid")
                htmlDiv4.Style.Add("border-bottom", "#cccccc 1px solid")

                ' メッセージ領域
                htmlDiv5.Style.Add("padding-top", "8px")
                htmlDiv5.Style.Add("padding-right", "8px")
                htmlDiv5.Style.Add("padding-left", "8px")
                htmlDiv5.Style.Add("padding-bottom", "8px")
                htmlDiv5.Style.Add("border-top", "#666666 1px solid")
                htmlDiv5.Style.Add("border-right", "#666666 1px solid")
                htmlDiv5.Style.Add("border-left", "#666666 1px solid")
                htmlDiv5.Style.Add("border-bottom", "#999999 1px solid")
                htmlDiv5.Style.Add("background-color", wc.ConvertToString([BackColor]))
                htmlDiv5.Style.Add("text-align", "left")

                htmlDiv5.Controls.Add([MessageControl])
                htmlDiv4.Controls.Add(htmlDiv5)
                htmlDiv2.Controls.Add(htmlDiv3)
                htmlDiv2.Controls.Add(htmlDiv4)
                htmlDiv1.Controls.Add(htmlDiv2)

                htmlDiv1.RenderControl(output)

            End If

        Catch ex As Exception
            output.Write(ex.Message)
        End Try

    End Sub

End Class



Pageへの記述は、
コード:
    <cc1:MyMessageControl id="MyMessageControl1" title="システムエラー発生" runat="server" Height="72px" Width="488px">
        <MessageControl>
            <TABLE width="100%" cellspacing="0" cellpadding="0" border="0">
                <tr runat="server">
                    <TD runat="server">
                        <asp:Label runat="server" ID="lblErrMsg">ここにメッセージが表示されます。</asp:Label>
                    </TD>
                </tr>
                <tr runat="server">
                    <TD runat="server">
                        <asp:Label runat="server" ID="lblStackTrace"></asp:Label>
                        ここにエラー詳細を表示します。</TD>
                </tr>
            </TABLE>
        </MessageControl>
    </cc1:MyMessageControl >




としております。

そもそも、Panelコントロールをプロパティに持たせてその中に子コントロールを…ということ自体に無理があるのかも
しれませんが、一応これでも正常に表示はできています。
ただ、デザイン時にほかのプロパティ値を変更すると、なぜか <MessageControl>が消えてしまいます。

どなたか問題を指摘していただけないでしょうか?
よろしくお願いします。

1

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