Бизнес-сценарий:
Осуществление в масштабах всего предприятия мха для производства компании с 30+ сайты и несколько десятков корпоративных отделов.
Бизнес-цель:
Несмотря на множество бизнес-групп (департаменты, места, и т.д.), Некоторые данные должны храниться на глобальном уровне. Например, авторитетный главный список всех физических местоположений компании (Например. производственные мощности, складов, офисы продаж) следует сохранить в одном месте.
Техническая проблема:
Таксономия предприятия был реализован с использованием нескольких семейств сайтов. Мы хотели бы создать авторитетный список физических мест пользовательского списка WSS. Затем, когда нам необходимо иметь столбец в типе контента (или столбец добавлен в библиотеку или список doc) которая содержала корпоративных отделений, Мы хотели бы создать столбец с использованием «поиска" тип данных и указывают на этот мастер список.
К сожалению, типы данных поиска необходимо получить доступ к список Источник «локально" означает, что наш авторитетный список не могут охватывать семейств веб-сайтов.
Техническое решение:
Реализация нового пользовательского типа данных реализованы на основе SPField и представлено в виде DropDownList в пользовательском интерфейсе, чьи ListItems заполнения из главного списка WSS.
Мы создали новое семейство под названием "http://localhost/EnterpriseData". Там, Мы создали пользовательский список с именем «Корпоративных отделений». Этот список просто использует стандартный заголовок»" поле будет содержать список фактических корпоративных мест.
Один следует несколько дискретных шагов для создания пользовательского типа данных в WSS. Они являются:
- Определите класс, который наследует от класса SPField (один может наследовать от других полей, если требуется).
Вот код для этого:
государственные класс XYZZYCorporateLocationField : SPFieldText
{
государственные XYZZYCorporateLocationField
(SPFieldCollection поля, Строка typeName, Строка displayName)
: база(поля, typeName, displayName) { }
государственные XYZZYCorporateLocationField
(SPFieldCollection поля, Строка displayName)
: база(поля, displayName) { }
государственные Переопределение BaseFieldControl FieldRenderingControl
{
Получить
{
BaseFieldControl управления = Новые функции XYZZYCorporateLocationFieldControl();
управления. Имя_поля = Это.InternalName;
возвращение управления;
} //Получить
} // FieldRenderingControl
государственные Переопределение Строка GetValidatedString(объект значение)
{
Если (Это.Обязательно || значение. ToString().Равно(Строка.Пустой))
{
бросать Новые функции SPFieldValidationException («Департамент не назначается.");
}
возвращение база.GetValidatedString(значение);
} // GetValidatedString
} // XYZZYCorporateLocation
- Определить другой класс, наследуемый от базового поля элемента управления, как и в:
государственные класс XYZZYCorporateLocationFieldControl : BaseFieldControl
{
Защита DropDownList XYZZYCorporateLocationSelector;
Защита Переопределение Строка DefaultTemplateName
{
Получить
{
возвращение «XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName
государственные Переопределение объект Значение
{
Получить
{
EnsureChildControls();
возвращение Это.XYZZYCorporateLocationSelector. SelectedValue;
} // Получить
набор
{
EnsureChildControls();
Это.XYZZYCorporateLocationSelector.SelectedValue = (Строка)Это.ItemFieldValue, при;
} // набор
} // переопределить объект значение
Защита Переопределение void CreateChildControls()
{
Если (Это.Поле == значение NULL || Это.ControlMode == SPControlMode.Дисплей)
возвращение;
база.CreateChildControls();
Это.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.(«XYZZYCorporateLocationSelector");
Если (Это.XYZZYCorporateLocationSelector == значение NULL)
бросать Новые функции Исключение(«ОШИБКА: Не удается загрузить. ASCX-файл!");
Если (!Это.IsPostBack страницы.)
{
использование (SPSite сайта = Новые функции SPSite(«http://localhost/enterprisedata"))
{
использование (SPWeb веб сайт =. OpenWeb())
{
SPList currentList = web. Списки[«Корпоративный места"];
по каждому элементу (SPItem XYZZYCorporateLocation в currentList.Items)
{
Если (XYZZYCorporateLocation["Название"] == значение NULL) продолжить;
Строка theTitle;
theTitle = XYZZYCorporateLocation["Название"].ToString();
Это.XYZZYCorporateLocationSelector.Items.Add
(Новые функции ListItem(theTitle, theTitle));
} // по каждому элементу
} // с помощью веб-spweb = site.openweb()
} // используя сайт spsite = новые spsite(«http://localhost/enterprisedata»)
} // Если не обратной передачи
} // CreateChildControls
} // XYZZYCorporateLocationFieldControl
Приведенный выше код в основном реализует логику для заполнения DropDownList с ценностями из пользовательского списка WSS, расположен в http://localhost/enterprisedata и именем «Корпоративные отделы».
Я определил обоих классов в одном CS-файл, скомпилировал его и положил его в глобальный кэш сборок (сильный требуется, Конечно).
-
Реализация шаблона элемента управления (.ASCX) как показано:
<%@ Управления Язык= "C#" Наследует="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Версия = 12.0.0.0, культура = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode«Всегда =" %>
<%@ Зарегистрироваться TagPrefix= «wssawc" Пространство имен="Microsoft.SharePoint.WebControls" Ассамблея="Microsoft.SharePoint, Версия = 12.0.0.0, Культура = нейтральных, PublicKeyToken = 71e9bce111e9429c" %> <%@ Зарегистрироваться TagPrefix= "SharePoint" Пространство имен="Microsoft.SharePoint.WebControls" Ассамблея="Microsoft.SharePoint, Версия = 12.0.0.0, Культура = нейтральных, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= «XYZZYCorporateLocationFieldControl" runat= «сервер»>
<Шаблон>
<ASP:DropDownList ID= «XYZZYCorporateLocationSelector" runat= "сервер" />
</Шаблон>
</SharePoint:RenderingTemplate>
Выше сохраняется в c:\Программа filescommon filesmicrosoft sharedweb сервера extensions12controltemplates.
- Наконец, Мы создаем XML-файл для сохранения в... 12XML каталог. Это CAML, который определяет наш пользовательский тип данных и для моего примера, как это выглядит:
<?XML Версия="1.0" кодирование="UTF-8" ?>
<FieldTypes>
<FieldType>
<Поле Имя="TypeName">CorporateLocations</Поле>
<Поле Имя="ParentType">Текст</Поле>
<Поле Имя="TypeDisplayName">Корпоративные места</Поле>
<Поле Имя="TypeShortDescription">Все XYZZY корпоративных отделений, включая производство или других объектов.</Поле>
<Поле Имя="UserCreatable">ПРАВДА</Поле>
<Поле Имя="ShowInListCreate">ПРАВДА</Поле>
<Поле Имя="ShowInDocumentLibraryCreate">ПРАВДА</Поле>
<Поле Имя="ShowInSurveyCreate">ПРАВДА</Поле>
<Поле Имя="ShowInColumnTemplateCreate">ПРАВДА</Поле>
<Поле Имя="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Версия = 1.0.0.0, Культура = нейтральных, PublicKeyToken = b0b19e85410990c4</Поле>
<RenderPattern Имя="DisplayPattern">
<Переключатель>
<Expr>
<Колонка />
</Expr>
<Дело Значение=""/>
<По умолчанию>
<HTML>
<![CDATA[<Span style = "цвет:Красный»><b>]]>
</HTML>
<Колонка SubColumnNumber="0" HTMLEncode="ПРАВДА"/>
<HTML><![CDATA[</b></диапазон>]]></HTML>
</По умолчанию>
</Переключатель>
</RenderPattern>
</FieldType>
</FieldTypes>
Этот XML-файл добавляет тип пользовательских данных WSS «Библиотека" и матчи против ПКК был Ассамблеи.
После переезда все эти биты на место, IISRESET на сервере и это все должны начать работать красиво.
с помощью объекта System.Web.UI;
с помощью System.Web.UI.WebControls;
Я пытаюсь реализовать ваше решение. Однако я вместо DropDownList, У меня только вариант для DropDownChoiceList. Вы будете знать, как добавление элементов в DropDownChoiceList? Мы используем SharePoint 2007 (SP1) и Visual Studio 2005 SP1.