WebPartManager.IPersonalizable.IsDirty 屬性

定義

取得值,指出網頁上 WebPartManager 控制項所管理的自訂個人化狀態資料是否已變更。

property bool System::Web::UI::WebControls::WebParts::IPersonalizable::IsDirty { bool get(); };
bool System.Web.UI.WebControls.WebParts.IPersonalizable.IsDirty { get; }
member this.System.Web.UI.WebControls.WebParts.IPersonalizable.IsDirty : bool
 ReadOnly Property IsDirty As Boolean Implements IPersonalizable.IsDirty

屬性值

Boolean

布林值,指出自訂個人化狀態資料是否已變更。

實作

範例

下列程式碼範例示範 屬性的 IPersonalizable.IsDirty 簡單用法,表示一些造成 WebPartManager 控制項個人化資料變更的常見頁面個人化實例。

程式碼範例有四個部分:

  • 使用者控制項,可讓您變更包含Web 組件控制項之頁面上的顯示模式。

  • 原始程式檔,其中包含兩個可連接之自訂 WebPart 控制項的程式碼,以及 介面。

  • 裝載所有控制項的網頁。

  • 說明程式碼範例的運作方式。

程式碼範例的第一個部分是變更顯示模式的使用者控制項。 您可以從類別概觀的 Example 區段取得使用者控制項的 WebPartManager 原始程式碼。 如需顯示模式和使用者控制項運作方式的資訊,請參閱逐步解說:變更Web 組件頁面上的顯示模式

範例的第二個部分是原始程式檔,其中包含自訂控制項和 介面。 請注意, IZipCode 介面會公開一個方法,而且在自訂 ZipCodeWebPart 控制項中實作的這個方法可作為回呼方法,以在 ZipCodeWebPart 連線案例中作為提供者。 另一個控制項 WeatherWebPart 會作為連接中的取用者控制項;它可以取用 所提供的 ZipCodeWebPart 特定介面。 在實際的應用程式中, WeatherWebPart 可能會取用提供者的個人化郵遞區號值,然後將圖形化天氣資訊提供給使用者。

若要執行程式碼範例,您必須編譯此原始程式碼。 您可以明確地編譯它,並將產生的元件放在網站的 Bin 資料夾或全域組件快取中。 或者,您可以將原始程式碼放在月臺的 App_Code 資料夾中,其將在執行時間動態編譯。 此程式碼範例會使用動態編譯;因此,請注意 Register ,網頁頂端這個元件的 指示詞只 TagPrefix 包含 和 Namespace 屬性,而不 Assembly 包含 屬性。 如需示範如何編譯的逐步解說,請參閱逐步解說 :開發和使用自訂 Web 服務器控制項

namespace Samples.AspNet.CS.Controls
{
  using System;
  using System.Web;
  using System.Web.Security;
  using System.Security.Permissions;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.WebParts;

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public interface IZipCode
  {
    string ZipCode { get; set;}
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class ZipCodeWebPart : WebPart, IZipCode
  {
    string zipCodeText = String.Empty;
    TextBox input;
    Button send;

    public ZipCodeWebPart()
    {
    }

    // Make the implemented property personalizable to save 
    // the Zip Code between browser sessions.
    [Personalizable()]
    public virtual string ZipCode
    {
      get { return zipCodeText; }
      set { zipCodeText = value; }
    }

    // This is the callback method that returns the provider.
    [ConnectionProvider("Zip Code", "ZipCodeProvider")]
    public IZipCode ProvideIZipCode()
    {
      return this;
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      input = new TextBox();
      this.Controls.Add(input);
      send = new Button();
      send.Text = "Enter 5-digit Zip Code";
      send.Click += new EventHandler(this.submit_Click);
      this.Controls.Add(send);
    }

    private void submit_Click(object sender, EventArgs e)
    {
      if (!string.IsNullOrEmpty(input.Text))
      {
        zipCodeText = Page.Server.HtmlEncode(input.Text);
        input.Text = String.Empty;
      }
    }
  }

  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class WeatherWebPart : WebPart
  {
    private IZipCode _provider;
    string _zipSearch;
    Label DisplayContent;

    // This method is identified by the ConnectionConsumer 
    // attribute, and is the mechanism for connecting with 
    // the provider. 
    [ConnectionConsumer("Zip Code", "ZipCodeConsumer")]
    public void GetIZipCode(IZipCode Provider)
    {
      _provider = Provider;
    }
    
    protected override void OnPreRender(EventArgs e)
    {
      EnsureChildControls();

      if (this._provider != null)
      {
        _zipSearch = _provider.ZipCode.Trim();
        DisplayContent.Text = "My Zip Code is:  " + _zipSearch;
      }
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      DisplayContent = new Label();
      this.Controls.Add(DisplayContent);
    }
  }
}
Imports System.Web
Imports System.Web.Security
Imports System.Security.Permissions
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Interface IZipCode

    Property ZipCode() As String

  End Interface

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class ZipCodeWebPart
    Inherits WebPart
    Implements IZipCode
    Private zipCodeText As String = String.Empty
    Private input As TextBox
    Private send As Button

    Public Sub New()
    End Sub

    ' Make the implemented property personalizable to save 
    ' the Zip Code between browser sessions.
    <Personalizable()> _
    Public Property ZipCode() As String _
      Implements IZipCode.ZipCode

      Get
        Return zipCodeText
      End Get
      Set(ByVal value As String)
        zipCodeText = value
      End Set
    End Property

    ' This is the callback method that returns the provider.
    <ConnectionProvider("Zip Code", "ZipCodeProvider")> _
    Public Function ProvideIZipCode() As IZipCode
      Return Me
    End Function


    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      input = New TextBox()
      Me.Controls.Add(input)
      send = New Button()
      send.Text = "Enter 5-digit Zip Code"
      AddHandler send.Click, AddressOf Me.submit_Click
      Me.Controls.Add(send)

    End Sub


    Private Sub submit_Click(ByVal sender As Object, _
      ByVal e As EventArgs)

      If input.Text <> String.Empty Then
        zipCodeText = Page.Server.HtmlEncode(input.Text)
        input.Text = String.Empty
      End If

    End Sub

  End Class

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class WeatherWebPart
    Inherits WebPart
    Private _provider As IZipCode
    Private _zipSearch As String
    Private DisplayContent As Label

    ' This method is identified by the ConnectionConsumer 
    ' attribute, and is the mechanism for connecting with 
    ' the provider. 
    <ConnectionConsumer("Zip Code", "ZipCodeConsumer")> _
    Public Sub GetIZipCode(ByVal Provider As IZipCode)
      _provider = Provider
    End Sub


    Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
      EnsureChildControls()

      If Not (Me._provider Is Nothing) Then
        _zipSearch = _provider.ZipCode.Trim()
                DisplayContent.Text = "My Zip Code is:  " + _zipSearch
      End If

    End Sub

    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      DisplayContent = New Label()
      Me.Controls.Add(DisplayContent)

    End Sub

  End Class

End Namespace

程式碼範例的第三個部分是網頁。 請注意,它包含兩 WebPartZone 個區域,其中第一個區域包含兩個自訂 WebPart 控制項。 另外還有一個 CatalogZone 區域,其中包含使用者可以新增至頁面的標準 Calendar 控制項。 元素 <asp:connectionszone> 會提供連線 UI,讓使用者建立控制項之間的連線。 請注意,在 方法中 Page_PreRender ,它會檢查個人化資料是否已變更,如果是,則會更新 的 Label1 文字。

<%@ Page Language="C#" %>
<%@ Register TagPrefix="uc1" 
    TagName="DisplayModeMenuCS"
    Src="~/displaymodemenucs.ascx" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  protected void Page_PreRender(object sender, EventArgs e)
  {
    // Clear the label if it has a previously set value.
    Label1.Text = String.Empty;
    
    // Cast the WebPartManager to the IPersonalizable interface 
    // so that you can access the property.  
    IPersonalizable stateData = (IPersonalizable)mgr1;
    if (stateData.IsDirty)
      Label1.Text = "WebPartManager personalization data is dirty.";
  }
    
  protected void Button1_Click(object sender, EventArgs e)
  {
    ProviderConnectionPoint provPoint = 
      mgr1.GetProviderConnectionPoints(zip1)["ZipCodeProvider"];
    ConsumerConnectionPoint connPoint = 
      mgr1.GetConsumerConnectionPoints(weather1)["ZipCodeConsumer"];
    WebPartConnection conn1 = mgr1.ConnectWebParts(zip1, provPoint,
      weather1, connPoint);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr1" runat="server" />
      <uc1:DisplayModeMenuCS ID="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider" />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:WebPartZone ID="WebPartZone2" runat="server">
        <ZoneTemplate>
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:CatalogZone ID="CatalogZone1" runat="server">
        <ZoneTemplate>
          <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart1" 
            runat="server">
            <WebPartsTemplate>
              <asp:Calendar ID="Calendar1" runat="server" 
                Title="My Calendar" />
            </WebPartsTemplate>
          </asp:DeclarativeCatalogPart>
          <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" />
        </ZoneTemplate>
      </asp:CatalogZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server" />
      <asp:Button ID="Button1" runat="server" 
        Text="Connect WebPart Controls" 
        OnClick="Button1_Click" />
      <hr />
      <asp:Label ID="Label1" runat="server" 
        Text="" 
        Font-Bold="true" />
    </div>
    </form>
</body>
</html>
<%@ Page Language="vb" %>
<%@ Register TagPrefix="uc1" 
    TagName="DisplayModeMenuVB"
    Src="~/displaymodemenuvb.ascx" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.VB.Controls" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  Protected Sub Page_PreRender(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    
    ' Clear the label if it has a previously set value.
    Label1.Text = String.Empty
    
    ' Cast the WebPartManager to the IPersonalizable interface 
    ' so that you can access the property.
    Dim stateData As IPersonalizable = CType(mgr1, IPersonalizable)
    If stateData.IsDirty Then
      Label1.Text = "WebPartManager personalization data is dirty."
    End If
    
  End Sub
    
  Protected Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs)

    Dim provPoint As ProviderConnectionPoint = _
      mgr1.GetProviderConnectionPoints(zip1)("ZipCodeProvider")
    Dim connPoint As ConsumerConnectionPoint = _
      mgr1.GetConsumerConnectionPoints(weather1)("ZipCodeConsumer")
    Dim conn1 As WebPartConnection = _
      mgr1.ConnectWebParts(zip1, provPoint, weather1, connPoint)
      
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr1" runat="server" />
      <uc1:DisplayModeMenuVB ID="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider" />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:WebPartZone ID="WebPartZone2" runat="server">
        <ZoneTemplate>
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:CatalogZone ID="CatalogZone1" runat="server">
        <ZoneTemplate>
          <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart1" 
            runat="server">
            <WebPartsTemplate>
              <asp:Calendar ID="Calendar1" runat="server" 
                Title="My Calendar" />
            </WebPartsTemplate>
          </asp:DeclarativeCatalogPart>
          <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" />
        </ZoneTemplate>
      </asp:CatalogZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server" />
      <asp:Button ID="Button1" runat="server" 
        Text="Connect WebPart Controls" 
        OnClick="Button1_Click" />
      <hr />
      <asp:Label ID="Label1" runat="server" 
        Text="" 
        Font-Bold="true" />
    </div>
    </form>
</body>
</html>

在瀏覽器中載入頁面之後,請嘗試建立本主題一節中所列的一些案例,以變更個人化資料。 當您進行各種變更時,當變更牽涉到控制項所追蹤 WebPartManager 的其中一個個人化案例時,會顯示控制項的 Label1 文字,表示個人化資料已變更。 例如,您可以:

  • 按一下 [連線 WebPart 控制項] 按鈕,以建立控制項之間的連線。

  • 使用 [ 顯示模式 ] 下拉式清單控制項將頁面切換為目錄模式,並將 [我的行事曆 ] 控制項新增至第二 WebPartZone 個區域。

  • 將頁面變更回瀏覽模式,按一下動詞功能表, (在 [ 我的行事曆 ] 控制項的標題列中) 箭號顯示,然後選取 [ 關閉 ] 將其關閉,並將其新增至頁面目錄。

  • 將頁面傳回目錄模式,並將 [我的行事曆] 控制項新增回頁面。

  • 使用 [顯示模式 ] 控制項將頁面切換為設計模式,並將一或多個控制項拖曳至另一個區域或相同區域中的不同位置,以重新排列控制項的配置。

備註

IPersonalizable.IsDirty屬性提供一種方式,讓呼叫端判斷控制項所 WebPartManager 管理的個人化狀態資料是否已變更。 當使用者個人化頁面層級的詳細資料時,例如變更頁面配置、建立或刪除連線,以及新增或刪除控制項,控制項所管理的個人化資料會 WebPartManager 變更。 這是傳遞方法,會傳回給呼叫端受保護 IsCustomPersonalizationStateDirty 屬性的值,呼叫端無法直接存取這個方法。

注意

屬性 IPersonalizable.IsDirty 不會指出可個人化屬性值或影響個別控制面板的個別 WebPart 屬性已變更。 個別追蹤每個控制項的控制層級個人化。 屬性 IPersonalizable.IsDirty 只會指出位於頁面層級且由 WebPartManager 控制項管理的個人化資料是否已變更。

下列清單描述會導致 屬性傳回 值的 true 一些常見個人化 IPersonalizable.IsDirty 實例,指出 WebPartManager 控制項有一些變更的個人化資料:

  • 關閉頁面上的靜態 WebPart 控制項 (或伺服器或使用者控制項) 。

  • 將關閉的靜態 WebPart 控制項從頁面目錄還原回頁面。

  • 將其區域內的任何控制項或移至另一個區域。

  • 從 或 伺服器控制項的 WebPart 目錄新增 控制項,或以程式設計方式新增 控制項。

  • 以程式設計方式或使用連接使用者介面 (UI) ,在兩 WebPart 個控制項之間建立連線。

  • 以程式設計方式或使用連線 UI 刪除兩 WebPart 個控制項之間的連線。

若要存取這個屬性值,您必須將 WebPartManager 控制項實例 IPersonalizable 轉換成 介面;然後,您可以讀取 IsDirty 屬性值。

適用於

另請參閱