IWebEditable Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Обеспечивает интерфейс для разработчика, позволяющий указывать настраиваемые элементы редактирования, связанные с элементом управления WebPart.
public interface class IWebEditable
public interface IWebEditable
type IWebEditable = interface
Public Interface IWebEditable
- Производный
Примеры
В следующем примере кода показано, как переопределить методы IWebEditable интерфейса в пользовательском WebPart элементе управления, который затем создает экземпляр пользовательского EditorPart элемента управления при переходе WebPart элемента управления в режим редактирования.
Этот пример состоит из четырех частей:
Код для пользовательского класса.
Веб-страница, на которую размещается пользовательский элемент управления.
Пользовательский элемент управления, который переключает страницу в режим редактирования.
Описание работы примера в браузере.
Первая часть примера кода — это пользовательский TextDisplayWebPart
класс. Обратите внимание, что класс является производным WebPart от класса и реализует IWebEditable интерфейс , предоставляя конкретные реализации для CreateEditorParts метода и WebBrowsableObject свойства . Обратите внимание, что вложенный TextDisplayWebPart
в класс является частным пользовательским TextDisplayEditorPart
классом, производным от базового EditorPart класса. Для выполнения примера кода необходимо скомпилировать этот исходный код. Ее можно скомпилировать явным образом и поместить полученную сборку в папку Bin веб-сайта или глобальный кэш сборок. Кроме того, исходный код можно поместить в папку App_Code сайта, где он будет динамически компилироваться во время выполнения. Пошаговое руководство, демонстрирующее оба метода компиляции, см. в разделе Пошаговое руководство. Разработка и использование пользовательского серверного веб-элемента управления.
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>
Третья часть примера кода — это пользовательский элемент управления, который позволяет пользователю переключать страницу в режим редактирования. Обратите внимание, что на веб-странице размещения указана ссылка на пользовательский элемент управления. Полное описание создания этого пользовательского элемента управления см. в разделе Пошаговое руководство. Изменение режимов отображения на странице веб-частей.
<%@ 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
элемента управления, щелкните стрелку раскрывающегося меню команд на элементе TextDisplayWebPart
управления и выберите Изменить. В пользовательском интерфейсе редактирования можно использовать раскрывающийся список, содержащий стили шрифтов, чтобы обновить стиль текста для метки в элементе TextDisplayWebPart
управления . В раскрывающемся списке Режимы отображения необходимо нажать кнопку Режим обзора , чтобы вернуть страницу в обычное представление и убедиться, что текст в метке теперь имеет стиль шрифта, выбранный в режиме редактирования.
Комментарии
Интерфейс IWebEditable позволяет связать пользовательские EditorPart элементы управления с серверным элементом управления, например элементом WebPart управления, пользовательским элементом управления или пользовательским серверным элементом управления. Элементы EditorPart управления содержатся в элементе EditorZone управления , и эта зона с элементами управления редактирования предоставляет конечным пользователям пользовательский интерфейс для изменения свойств, внешнего вида и поведения связанного WebPart элемента управления.
Интерфейс IWebEditable включает два доступных члена. Свойство WebBrowsableObject позволяет EditorPart элементам управления получить ссылку на связанный серверный элемент управления. Метод CreateEditorParts используется для создания экземпляра каждого пользовательского EditorPart элемента управления, связанного с серверным элементом управления, и возврата их в виде коллекции.
Интерфейс IWebEditable уже реализован в базовом WebPart классе, хотя по умолчанию эта реализация не связывает пользовательские EditorPart элементы управления с классом WebPart . Чтобы связать производный WebPart элемент управления с пользовательскими EditorPart элементами управления, можно переопределить CreateEditorParts метод .
Примечания для тех, кто реализует этот метод
Если вы хотите использовать серверные элементы управления, которые не WebPart являются элементами управления в приложении веб-частей (то есть добавить эти элементы управления в WebPartZoneBase зону), и если вы хотите связать пользовательские EditorPart элементы управления с такими серверными элементами управления, необходимо реализовать IWebEditable интерфейс . Производные WebPart элементы управления не должны реализовывать интерфейс , так как базовый WebPart класс уже это делает.
Свойства
WebBrowsableObject |
Получает ссылку на элемент управления WebPart, пользовательский элемент управления или настраиваемый элемент управления для разрешения его изменения элементами управления EditorPart. |
Методы
CreateEditorParts() |
Возвращает коллекцию настраиваемых элементов управления EditorPart, связанных с серверным элементом управления, реализующим интерфейс IWebEditable. |