<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:Button ID="Button2" runat="server" Text="Button" />
</ContentTemplate>
</asp:UpdatePanel>
其實會造成 UpdatePanel 在設計階段這種結果,主要是 UpdatePanel 在設計階段輸出的 HTML 碼沒有設定寬度的關係,所以我們繼承 UpdatePanel 下來改寫一個新的 TBUpdatePanel,並改寫它的 Designer 重新調整輸出設計階段的 HTML 碼來解決此問題。
我們先來看一下 TBUpdatePanel 的結果,後面再來詳述修改方式。同樣的,在 TBUpdatePanel 中只簡單放置 TextBox 及 Button 二個控制項。
<bee:TBUpdatePanel ID="TBUpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />
</ContentTemplate>
</bee:TBUpdatePanel>
< _
Designer(GetType(TBUpdatePanelDesigner)), _
ToolboxData("<{0}:TBUpdatePanel runat=server></{0}:TBUpdatePanel>") _
> _
Public Class TBUpdatePanel
Inherits System.Web.UI.UpdatePanel
End Class再來就是如何撰寫 TBUpdatePanelDesigner,TBUpdatePanelDesigner 繼承 UpdatePanel 原有的 UpdatePanelDesigner,覆寫 GetDesignTimeHtml 方法來重新調整輸出的 HTML 碼。UpdatePanelDesigner 原本的輸出的 HTML 碼如下圖所示。

很明顯地,它最外層的 table 並未指定 witdh 才會導致設計階段的異常情形,所以我們只要將 table 的 width 設為 100% 就可以解決此問題。TBUpdatePanelDesigner 的完整程式碼如下,如此簡單的修改就可以永遠擺脫 UpdatePanel 的排版而困擾了。
''' <summary>
''' 擴充 TBUpdatePanel 控制項的設計模式行為。
''' </summary>
Public Class TBUpdatePanelDesigner
Inherits System.Web.UI.Design.UpdatePanelDesigner
Public Overrides Function GetDesignTimeHtml(ByVal regions As DesignerRegionCollection) As String
Dim sHTML As String
sHTML = MyBase.GetDesignTimeHtml(regions)
sHTML = Left(sHTML, 7) & " width=""100%"" " & Mid(sHTML, 8)
Return sHTML
End Function
End Class