IWebEditable 接口

定义

为开发人员提供接口,以指定与 WebPart 控件相关联的自定义编辑控件。

public interface class IWebEditable
public interface IWebEditable
type IWebEditable = interface
Public Interface IWebEditable
派生

示例

下面的代码示例演示如何重写自定义WebPart控件中的接口方法IWebEditable,然后在控件进入编辑模式时WebPart创建自定义EditorPart控件的实例。

此示例有四个部分:

  • 自定义类的代码。

  • 承载自定义控件的网页。

  • 将页面切换到编辑模式的用户控件。

  • 说明示例在浏览器中的工作原理。

代码示例的第一部分是自定义 TextDisplayWebPart 类。 请注意,该类派生自 WebPart 该类并实现 IWebEditable 接口,为 CreateEditorParts 方法和 WebBrowsableObject 属性提供特定的实现。 另请注意,嵌套在TextDisplayWebPart类中是派生自基EditorPart类的私有自定义TextDisplayEditorPart类。 若要运行代码示例,必须编译此源代码。 可以显式编译它,并将生成的程序集放入网站的 Bin 文件夹或全局程序集缓存中。 或者,可以将源代码放在站点的App_Code文件夹中,该文件夹中将在运行时动态编译。 有关演示两种编译方法的演练,请参阅 演练:开发和使用自定义 Web 服务器控件

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace Samples.AspNet.CS.Controls
{
  [AspNetHostingPermission(SecurityAction.Demand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand,
    Level = AspNetHostingPermissionLevel.Minimal)]
  public class TextDisplayWebPart : WebPart
  {
    private String _contentText = null;
    private String _fontStyle = null;
    TextBox input;
    Label DisplayContent;
    Literal lineBreak;

    public override EditorPartCollection CreateEditorParts()
    {
      ArrayList editorArray = new ArrayList();
      TextDisplayEditorPart edPart = new TextDisplayEditorPart();
      edPart.ID = this.ID + "_editorPart1";
      editorArray.Add(edPart);
      EditorPartCollection editorParts = 
        new EditorPartCollection(editorArray);
      return editorParts;
    }

    public override object WebBrowsableObject
    {
      get { return this; }
    }

    [Personalizable(), WebBrowsable]
    public String ContentText
    {
      get { return _contentText; }
      set { _contentText = value; }
    }

    [Personalizable(), WebBrowsable()]
    public String FontStyle
    {
      get { return _fontStyle; }
      set { _fontStyle = value; }
    }

    protected override void CreateChildControls()
    {
      Controls.Clear();
      DisplayContent = new Label();
      DisplayContent.BackColor = Color.LightBlue;
      DisplayContent.Text = this.ContentText;
      if (FontStyle == null)
        FontStyle = "None";
      SetFontStyle(DisplayContent, FontStyle);
      this.Controls.Add(DisplayContent);

      lineBreak = new Literal();
      lineBreak.Text = @"<br />";
      Controls.Add(lineBreak);

      input = new TextBox();
      this.Controls.Add(input);
      Button update = new Button();
      update.Text = "Set Label Content";
      update.Click += new EventHandler(this.submit_Click);
      this.Controls.Add(update);
    }

    private void submit_Click(object sender, EventArgs e)
    {
      // Update the label string.
      if (!string.IsNullOrEmpty(input.Text))
      {
        _contentText = input.Text + @"<br />";
        input.Text = String.Empty;
        DisplayContent.Text = this.ContentText;
      }
    }

    private void SetFontStyle(Label label, String selectedStyle)
    {
      if (selectedStyle == "Bold")
      {
        label.Font.Bold = true;
        label.Font.Italic = false;
        label.Font.Underline = false;
      }
      else if (selectedStyle == "Italic")
      {
        label.Font.Italic = true;
        label.Font.Bold = false;
        label.Font.Underline = false;
      }
      else if (selectedStyle == "Underline")
      {
        label.Font.Underline = true;
        label.Font.Bold = false;
        label.Font.Italic = false;
      }
      else
      {
        label.Font.Bold = false;
        label.Font.Italic = false;
        label.Font.Underline = false;
      }
    }

    // Create a custom EditorPart to edit the WebPart control.
    [AspNetHostingPermission(SecurityAction.Demand,
      Level = AspNetHostingPermissionLevel.Minimal)]
    private class TextDisplayEditorPart : EditorPart
    {
      DropDownList _partContentFontStyle;

      public override bool ApplyChanges()
      {
        TextDisplayWebPart part = 
          (TextDisplayWebPart)WebPartToEdit;
        // Update the custom WebPart control with the font style.
        part.FontStyle = PartContentFontStyle.SelectedValue;

        return true;
      }

      public override void SyncChanges()
      {
        TextDisplayWebPart part = 
          (TextDisplayWebPart)WebPartToEdit;
        String currentStyle = part.FontStyle;

        // Select the current font style in the drop-down control.
        foreach (ListItem item in PartContentFontStyle.Items)
        {
          if (item.Value == currentStyle)
          {
            item.Selected = true;
            break;
          }
        }
      }

      protected override void CreateChildControls()
      {
        Controls.Clear();

        // Add a set of font styles to the dropdown list.
        _partContentFontStyle = new DropDownList();
        _partContentFontStyle.Items.Add("Bold");
        _partContentFontStyle.Items.Add("Italic");
        _partContentFontStyle.Items.Add("Underline");
        _partContentFontStyle.Items.Add("None");

        Controls.Add(_partContentFontStyle);
      }

      protected override void RenderContents(HtmlTextWriter writer)
      {
        writer.Write("<b>Text Content Font Style</b>");
        writer.WriteBreak();
        writer.Write("Select a font style.");
        writer.WriteBreak();
        _partContentFontStyle.RenderControl(writer);
        writer.WriteBreak();
      }

      // Access the drop-down control through a property.
      private DropDownList PartContentFontStyle
      {
        get 
        {
          EnsureChildControls();
          return _partContentFontStyle;
        }
      }
    }
  }
}
Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Security.Permissions
Imports System.Web
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 Class TextDisplayWebPart
    Inherits WebPart
    Private _contentText As String = Nothing
    Private _fontStyle As String = Nothing
    Private input As TextBox
    Private DisplayContent As Label
    Private lineBreak As Literal

    Public Overrides Function CreateEditorParts() _
                                As EditorPartCollection
      Dim editorArray As New ArrayList()
      Dim edPart as New TextDisplayEditorPart()
      edPart.ID = Me.ID & "_editorPart1"
      editorArray.Add(edPart)
      Dim editorParts As New EditorPartCollection(editorArray)
      Return editorParts

    End Function

    Public Overrides ReadOnly Property WebBrowsableObject() _
                                        As Object
      Get
        Return Me
      End Get
    End Property

    <Personalizable(), WebBrowsable()> _
    Public Property ContentText() As String
      Get
        Return _contentText
      End Get
      Set(ByVal value As String)
        _contentText = Value
      End Set
    End Property

    <Personalizable(), WebBrowsable()> _
    Public Property FontStyle() As String
      Get
        Return _fontStyle
      End Get
      Set(ByVal value As String)
        _fontStyle = Value
      End Set
    End Property

    Protected Overrides Sub CreateChildControls()
      Controls.Clear()
      DisplayContent = New Label()
      DisplayContent.BackColor = Color.LightBlue
      DisplayContent.Text = Me.ContentText
      If FontStyle Is Nothing Then
        FontStyle = "None"
      End If
      SetFontStyle(DisplayContent, FontStyle)
      Me.Controls.Add(DisplayContent)

      lineBreak = New Literal()
      lineBreak.Text = "<br />"
      Controls.Add(lineBreak)

      input = New TextBox()
      Me.Controls.Add(input)
      Dim update As New Button()
      update.Text = "Set Label Content"
      AddHandler update.Click, AddressOf Me.submit_Click
      Me.Controls.Add(update)

    End Sub

    Private Sub submit_Click(ByVal sender As Object, _
                             ByVal e As EventArgs)
      ' Update the label string.
      If input.Text <> String.Empty Then
        _contentText = input.Text + "<br />"
        input.Text = String.Empty
        DisplayContent.Text = Me.ContentText
      End If

    End Sub

    Private Sub SetFontStyle(ByVal label As Label, _
                             ByVal selectedStyle As String)
      If selectedStyle = "Bold" Then
        label.Font.Bold = True
        label.Font.Italic = False
        label.Font.Underline = False
      ElseIf selectedStyle = "Italic" Then
        label.Font.Italic = True
        label.Font.Bold = False
        label.Font.Underline = False
      ElseIf selectedStyle = "Underline" Then
        label.Font.Underline = True
        label.Font.Bold = False
        label.Font.Italic = False
      Else
        label.Font.Bold = False
        label.Font.Italic = False
        label.Font.Underline = False
      End If

    End Sub

    ' Create a custom EditorPart to edit the WebPart control.
    <AspNetHostingPermission(SecurityAction.Demand, _
      Level:=AspNetHostingPermissionLevel.Minimal)> _
    Private Class TextDisplayEditorPart
      Inherits EditorPart
      Private _partContentFontStyle As DropDownList

      Public Overrides Function ApplyChanges() As Boolean
        Dim part As TextDisplayWebPart = CType(WebPartToEdit, _
                                               TextDisplayWebPart)
        ' Update the custom WebPart control with the font style.
        part.FontStyle = PartContentFontStyle.SelectedValue

        Return True

      End Function

      Public Overrides Sub SyncChanges()
        Dim part As TextDisplayWebPart = CType(WebPartToEdit, _
                                               TextDisplayWebPart)
        Dim currentStyle As String = part.FontStyle

        ' Select the current font style in the drop-down control.
        Dim item As ListItem
        For Each item In PartContentFontStyle.Items
          If item.Value = currentStyle Then
            item.Selected = True
            Exit For
          End If
        Next item

      End Sub

      Protected Overrides Sub CreateChildControls()
        Controls.Clear()

        ' Add a set of font styles to the dropdown list.
        _partContentFontStyle = New DropDownList()
        _partContentFontStyle.Items.Add("Bold")
        _partContentFontStyle.Items.Add("Italic")
        _partContentFontStyle.Items.Add("Underline")
        _partContentFontStyle.Items.Add("None")

        Controls.Add(_partContentFontStyle)

      End Sub

      Protected Overrides Sub RenderContents(ByVal writer _
                                             As HtmlTextWriter)
        writer.Write("<b>Text Content Font Style</b>")
        writer.WriteBreak()
        writer.Write("Select a font style.")
        writer.WriteBreak()
        _partContentFontStyle.RenderControl(writer)
        writer.WriteBreak()

      End Sub

      ' Access the drop-down control through a property.
      Private ReadOnly Property PartContentFontStyle() As DropDownList
        Get
          EnsureChildControls()
          Return _partContentFontStyle
        End Get
      End Property

    End Class

  End Class

End Namespace

代码示例的第二部分是承载自定义控件的网页。 请注意,虽然 EditorZone 控件是在页面标记中声明的,但 EditorPart 自定义控件不需要在那里引用,因为它可以在运行时以编程方式添加。

<%@ page language="c#" %>
<%@ register TagPrefix="uc1" 
  TagName="DisplayModeUC" 
  Src="DisplayModeUCcs.ascx" %>
<%@ register tagprefix="aspSample" 
  Namespace="Samples.AspNet.CS.Controls" 
  Assembly="TextDisplayWebPartCS" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>
      Text Display WebPart with EditorPart
    </title>
  </head>
  <body>
    <form id="form1" runat="server">
      <asp:webpartmanager id="WebPartManager1" runat="server" />
      <uc1:DisplayModeUC ID="DisplayModeUC1" runat="server" />
      <asp:webpartzone id="zone1" runat="server" 
        CloseVerb-Enabled="false">
        <zonetemplate>
          <aspSample:TextDisplayWebPart 
            runat="server"   
            id="textwebpart" 
            title = "Text Content WebPart" /> 
        </zonetemplate>
      </asp:webpartzone> 
      <asp:EditorZone ID="EditorZone1" runat="server" /> 
    </form>
  </body>
</html>
<%@ page language="vb" %>
<%@ register TagPrefix="uc1" 
  TagName="DisplayModeUC" 
  Src="DisplayModeUCvb.ascx" %>
<%@ register tagprefix="aspSample" 
  Namespace="Samples.AspNet.VB.Controls" 
  Assembly="TextDisplayWebPartVB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>
      Text Display WebPart with EditorPart
    </title>
  </head>
  <body>
    <form id="form1" runat="server">
      <asp:webpartmanager id="WebPartManager1" runat="server" />
      <uc1:DisplayModeUC ID="DisplayModeUC1" runat="server" />
      <asp:webpartzone id="zone1" runat="server" 
        CloseVerb-Enabled="false">
        <zonetemplate>
          <aspSample:TextDisplayWebPart 
            runat="server"   
            id="textwebpart" 
            title = "Text Content WebPart" />
        </zonetemplate>
      </asp:webpartzone> 
      <asp:EditorZone ID="EditorZone1" runat="server" /> 
    </form>
  </body>
</html>

代码示例的第三部分是允许用户将页面切换到编辑模式的用户控件。 请注意,托管网页中引用了用户控件。 有关如何创建此用户控件的完整说明,请参阅演练:更改Web 部件页上的显示模式

<%@ control language="C#" classname="DisplayModeMenu"%>

<script runat="server">

  // On initial load, fill the dropdown with display modes.
  void DisplayModeDropdown_Load(object sender, System.EventArgs e)
  {
    if (!IsPostBack)
    {
      WebPartManager mgr = 
        WebPartManager.GetCurrentWebPartManager(Page);
      String browseModeName = WebPartManager.BrowseDisplayMode.Name;
      // Use a sorted list so the modes are sorted alphabetically.
      SortedList itemArray = 
        new SortedList(mgr.SupportedDisplayModes.Count);

      // Add display modes only if they are supported on the page.
      foreach (WebPartDisplayMode mode in mgr.SupportedDisplayModes)
      {
        String modeName = mode.Name;
        itemArray.Add(modeName, modeName + " Mode");      
      }
      // Fill the dropdown with the display mode names.
      foreach(DictionaryEntry arrayItem in itemArray)
      {
        ListItem item = new ListItem(arrayItem.Value.ToString(), 
          arrayItem.Key.ToString());
        if (item.Value == browseModeName)
          item.Selected = true;
        DisplayModeDropdown.Items.Add(item);
      }
    }
  }

  // Change the page to the selected display mode.
  void DisplayModeDropdown_SelectedIndexChanged(object sender, 
    EventArgs e)
  {
    WebPartManager mgr = WebPartManager.GetCurrentWebPartManager(Page);
    String selectedMode = DisplayModeDropdown.SelectedValue;

    foreach (WebPartDisplayMode mode in mgr.SupportedDisplayModes)
    {
      if (selectedMode == mode.Name)
      {
        mgr.DisplayMode = mode;
        break;
      }
    }
  }

</script>
<div>
  <asp:DropDownList ID="DisplayModeDropdown" 
    runat="server" 
    AutoPostBack="true" 
    OnLoad="DisplayModeDropdown_Load" 
    OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" />
</div>
<%@ control language="vb" classname="DisplayModeMenu"%>

<script runat="server">

 ' On initial load, fill the dropdown with display modes.
  Sub DisplayModeDropdown_Load(ByVal sender As Object, _
                               ByVal e As System.EventArgs)
    If Not IsPostBack Then
      Dim mgr As WebPartManager = _
        WebPartManager.GetCurrentWebPartManager(Page)
      Dim browseModeName As String = _
        WebPartManager.BrowseDisplayMode.Name
      ' Use a sorted list so the modes are sorted alphabetically.
      Dim itemArray As New SortedList(mgr.SupportedDisplayModes.Count)
        
      ' Add display modes only if they are supported on the page.
      Dim mode As WebPartDisplayMode
      For Each mode In mgr.SupportedDisplayModes
        Dim modeName As String = mode.Name
        itemArray.Add(modeName, modeName + " Mode")
      Next mode
      ' Fill the dropdown with the display mode names.
      Dim arrayItem As DictionaryEntry
      For Each arrayItem In itemArray
        Dim item As New ListItem(arrayItem.Value.ToString(), _
                                 arrayItem.Key.ToString())
        If item.Value = browseModeName Then
          item.Selected = True
        End If
        DisplayModeDropdown.Items.Add(item)
      Next arrayItem
    End If

  End Sub


' Change the page to the selected display mode.
  Sub DisplayModeDropdown_SelectedIndexChanged(ByVal sender As Object, _
                                               ByVal e As EventArgs)
    Dim mgr As WebPartManager = _
      WebPartManager.GetCurrentWebPartManager(Page)
    Dim selectedMode As String = DisplayModeDropdown.SelectedValue
    
    Dim mode As WebPartDisplayMode
    For Each mode In mgr.SupportedDisplayModes
      If selectedMode = mode.Name Then
        mgr.DisplayMode = mode
        Exit For
      End If
    Next mode

  End Sub

</script>
<div>
  <asp:DropDownList ID="DisplayModeDropdown" 
    runat="server" 
    AutoPostBack="true" 
    OnLoad="DisplayModeDropdown_Load" 
    OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" />
</div>

若要运行代码示例,请在浏览器中加载宿主网页,将一些文本添加到文本框,然后单击“ 设置标签内容 ”按钮以更新控件中的标签。 若要将页面切换到编辑模式,请从包含显示模式的下拉列表中选择“ 编辑 ”。 若要从自定义 TextDisplayEditorPart 控件显示 UI,请单击控件上的 TextDisplayWebPart 谓词菜单下拉箭头,然后选择“ 编辑”。 在编辑 UI 中,可以使用包含字体样式的下拉列表更新控件中 TextDisplayWebPart 标签的文本样式。 必须在显示模式下拉列表中单击 “浏览模式 ”,才能将页面返回到普通视图,并确认标签中的文本现在具有在编辑模式下选择的字体样式。

注解

通过此 IWebEditable 接口,可以将自定义 EditorPart 控件与服务器控件(例如 WebPart 控件、用户控件或自定义服务器控件)相关联。 控件包含在控件EditorZone中,此EditorPart区域及其编辑控件为最终用户提供用户界面 (UI) ,用于修改关联WebPart控件的属性、外观和行为。

IWebEditable 接口包含两个公开的成员。 该 WebBrowsableObject 属性为 EditorPart 控件提供了获取对关联服务器控件的引用的方法。 该方法 CreateEditorParts 用于创建与服务器控件关联的每个自定义 EditorPart 控件的实例,并将其作为集合返回。

接口 IWebEditable 已在基 WebPart 类上实现,但默认情况下,此实现不会将任何自定义 EditorPart 控件与 WebPart 类相关联。 若要将派生 WebPart 控件与自定义 EditorPart 控件相关联,可以重写该方法 CreateEditorParts

实施者说明

如果要在Web 部件应用程序中使用不是WebPart控件的服务器控件, (即,如果将这些控件添加到WebPartZoneBase区域) ,并且如果要将自定义EditorPart控件与此类服务器控件相关联,则需要实现IWebEditable接口。 WebPart派生控件不应实现接口,因为基WebPart类已实现该接口。

属性

WebBrowsableObject

获取对将由 WebPart 控件编辑的 EditorPart 控件、用户控件或自定义控件的引用。

方法

CreateEditorParts()

返回实现 EditorPart 接口的服务器控件的关联自定义 IWebEditable 控件的集合。

适用于

另请参阅