Udostępnij za pośrednictwem


IWebEditable Interfejs

Definicja

Udostępnia interfejs dla deweloperów do określania niestandardowych kontrolek edycji skojarzonych z kontrolką WebPart .

public interface class IWebEditable
public interface IWebEditable
type IWebEditable = interface
Public Interface IWebEditable
Pochodne

Przykłady

Poniższy przykład kodu pokazuje, jak zastąpić metody interfejsu IWebEditable w niestandardowej kontrolce, która następnie tworzy wystąpienie kontrolki niestandardowej WebPartEditorPart po WebPart wprowadzeniu trybu edycji.

Ten przykład zawiera cztery części:

  • Kod dla klasy niestandardowej.

  • Strona sieci Web, która hostuje kontrolkę niestandardową.

  • Kontrolka użytkownika, która przełącza stronę w tryb edycji.

  • Opis sposobu działania przykładu w przeglądarce.

Pierwszą częścią przykładu kodu jest klasa niestandardowa TextDisplayWebPart . Zwróć uwagę, że klasa pochodzi z WebPart klasy i implementuje IWebEditable interfejs, zapewniając określone implementacje CreateEditorParts dla metody i WebBrowsableObject właściwości. Zauważ również, że zagnieżdżone w TextDisplayWebPart klasie jest prywatną, niestandardową TextDisplayEditorPart klasą pochodzącą z klasy bazowej EditorPart . Aby przykład kodu został uruchomiony, należy skompilować ten kod źródłowy. Można je jawnie skompilować i umieścić wynikowy zestaw w folderze Bin witryny sieci Web lub globalnej pamięci podręcznej zestawów. Możesz też umieścić kod źródłowy w folderze App_Code witryny, w którym będzie dynamicznie kompilowany w czasie wykonywania. Aby zapoznać się z przewodnikiem, który pokazuje obie metody kompilowania, zobacz Przewodnik: opracowywanie i używanie niestandardowej kontroli serwera sieci 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

Drugą częścią przykładu kodu jest strona sieci Web, która hostuje kontrolkę niestandardową. Zwróć uwagę, że chociaż kontrolka EditorZone jest zadeklarowana w znaczniku strony, kontrolka niestandardowa EditorPart nie musi być tam przywoływana, ponieważ można ją dodać programowo w czasie wykonywania.

<%@ 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>

Trzecia część przykładu kodu to kontrolka użytkownika, która umożliwia użytkownikowi przełączenie strony w tryb edycji. Zwróć uwagę, że kontrolka użytkownika jest przywołyni na stronie internetowej hostingu. Aby uzyskać pełny opis sposobu tworzenia tej kontrolki użytkownika, zobacz Przewodnik: zmienianie trybów wyświetlania na stronie składników Web Part.

<%@ 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>

Aby uruchomić przykład kodu, załaduj hostowanie strony sieci Web w przeglądarce, dodaj jakiś tekst do pola tekstowego, a następnie kliknij przycisk Ustaw zawartość etykiety , aby zaktualizować etykietę w kontrolce. Aby przełączyć stronę do trybu edycji, wybierz pozycję Edytuj z listy rozwijanej zawierającej tryby wyświetlania. Aby wyświetlić interfejs użytkownika z kontrolki niestandardowej TextDisplayEditorPart , kliknij strzałkę listy rozwijanej menu czasowników w kontrolce TextDisplayWebPart , a następnie wybierz pozycję Edytuj. W interfejsie użytkownika edycji możesz użyć listy rozwijanej zawierającej style czcionek, aby zaktualizować styl tekstu etykiety w kontrolce TextDisplayWebPart . Musisz kliknąć pozycję Tryb przeglądania na liście rozwijanej tryby wyświetlania, aby przywrócić stronę do normalnego widoku i potwierdzić, że tekst w etykiecie ma teraz wybrany styl czcionki w trybie edycji.

Uwagi

Interfejs IWebEditable umożliwia skojarzenie kontrolek niestandardowych EditorPart z kontrolką serwera, taką jak WebPart kontrolka, kontrolka użytkownika lub niestandardowa kontrolka serwera. Kontrolki EditorPart są zawarte w kontrolce EditorZone , a ta strefa z kontrolkami edycji zapewnia użytkownikom końcowym interfejs użytkownika do modyfikowania właściwości, wyglądu i zachowania skojarzonej WebPart kontrolki.

Interfejs IWebEditable zawiera dwa uwidocznione elementy członkowskie. Właściwość WebBrowsableObject umożliwia EditorPart sterowanie uzyskaniem odwołania do skojarzonej kontrolki serwera. Metoda CreateEditorParts służy do tworzenia wystąpienia każdej kontrolki niestandardowej EditorPart skojarzonej z kontrolką serwera i zwracania ich jako kolekcji.

Interfejs IWebEditable jest już implementowany w klasie bazowej WebPart , chociaż domyślnie ta implementacja nie kojarzy żadnych kontrolek niestandardowych EditorPart z klasą WebPart . Aby skojarzyć pochodną WebPart kontrolkę z kontrolkami niestandardowymi EditorPart , można zastąpić metodę CreateEditorParts .

Uwagi dotyczące implementowania

Jeśli chcesz użyć kontrolek serwera, które nie WebPart są kontrolkami w aplikacji składników Web Part (czyli w przypadku dodania tych kontrolek do WebPartZoneBase strefy), a jeśli chcesz skojarzyć kontrolki niestandardowe EditorPart z takimi kontrolkami serwera, musisz zaimplementować IWebEditable interfejs. Kontrolki pochodne WebPart nie powinny implementować interfejsu, ponieważ klasa bazowa WebPart już to robi.

Właściwości

WebBrowsableObject

Pobiera odwołanie do kontrolki, kontrolki WebPart użytkownika lub kontrolki niestandardowej, która będzie edytowana przez EditorPart kontrolki.

Metody

CreateEditorParts()

Zwraca kolekcję kontrolek niestandardowych EditorPart skojarzonych z kontrolką serwera, która implementuje IWebEditable interfejs.

Dotyczy

Zobacz też