모스: 기능 예-사용자 정의 데이터 형식

비즈니스 시나리오:

제조 회사에 대 한 이끼의 엔터프라이즈 구현 30+ 사이트 및 몇 가지 12 개 기업 부서.

비즈니스 목표:

비즈니스 그룹의 군중에도 불구 하 고 (부서, 위치, 등), 글로벌 수준에서 특정 데이터를 유지 합니다.. 예를 들어, 회사의 모든 물리적 위치는 신뢰할 수 있는 마스터 목록 (예를 들어. 제조 시설, 창 고 위치, 영업 사무소) 중앙 위치에서 유지 되어야 합니다..

기술 문제:

기업 분류는 여러 사이트 모음을 사용 하 여 구현 된. 우리는 사용자 지정 WSS 목록에서 실제 위치 신뢰할 수 있는 목록을 만들 수 있으면 좋 겠. 다음, 우리는 콘텐츠 형식에 열을 필요로 할 때 (목록 또는 문서 라이브러리에 열 추가 또는) 기업의 위치를 포함는, 우리 "조회를 사용 하 여 열을 만들 것입니다." 데이터 형식 및이 마스터 목록에 포인트.

불행 하 게도, 조회 데이터 소스 목록 "로컬 액세스 해야 합니다." 우리의 신뢰할 수 있는 목록 사이트 모음에 걸쳐 있을 수 없습니다 의미.

기술 솔루션:

새 사용자 정의 데이터 형식에 따라 SPField을 구현 하 고 누구의 ListItems 마스터 WSS 목록에서 채우는 UI에 드롭다운 목록으로 표시 구현.

라는 새 사이트 모음을 만들었습니다. "http://localhost/EnterpriseData". 거기, "기업의 위치" 라는 사용자 지정 목록을 만들었습니다.. 이 목록은 표준 "제목 사용" 실제 기업의 위치 목록을 포함 하는 필드.

한 wss에서 사용자 정의 데이터 형식을 만드는 데 여러 개별 단계를 따릅니다.. 그들은:

  1. SPField에서 상속 하는 클래스 정의 (필요한 경우 하나 다른 분야에서 상속 받을 수 있습니다.).

다음은 그에 대 한 코드:

공용 클래스 XYZZYCorporateLocationField : SPFieldText
{
공용 XYZZYCorporateLocationField
(SPFieldCollection 필드, 문자열 typeName, 문자열 displayName)
: 자료(필드, typeName, displayName) { }

공용 XYZZYCorporateLocationField
(SPFieldCollection 필드, 문자열 displayName)
: 자료(필드, displayName) { }

공용 재정의 BaseFieldControl FieldRenderingControl
{
가져오기
{
BaseFieldControl 제어 = 새로운 내용 XYZZYCorporateLocationFieldControl();
제어 합니다. FieldName = .InternalName;
반환 제어;
} //가져오기
} // fieldrenderingcontrol

공용 재정의 문자열 GetValidatedString(개체 값)
{
만약 (.필수 || 값입니다. ToString().같음(문자열.빈))
{
던져 새로운 내용 SPFieldValidationException ("부서 할당 되지 않습니다.");
}
반환 자료.GetValidatedString(값);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. 기본 필드 컨트롤에서 상속 하는 다른 클래스 정의, 마찬가지로:

공용 클래스 XYZZYCorporateLocationFieldControl : BaseFieldControl
{
보호 드롭다운 목록 XYZZYCorporateLocationSelector;

보호 재정의 문자열 DefaultTemplateName
{
가져오기
{
반환 "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

공용 재정의 개체
{
가져오기
{
EnsureChildControls();
반환 .XYZZYCorporateLocationSelector입니다. SelectedValue;
} // 가져오기
설정
{
EnsureChildControls();
.XYZZYCorporateLocationSelector.SelectedValue = (문자열).ItemFieldValue;
} // 설정
} // 개체 값 재정의

보호 재정의 void CreateChildControls()
{

만약 (.필드 = = null || .ControlMode = = SPControlMode.디스플레이)
반환;

자료.CreateChildControls();

.XYZZYCorporateLocationSelector =
(드롭다운 목록)FindControl TemplateContainer입니다.("XYZZYCorporateLocationSelector");

만약 (.XYZZYCorporateLocationSelector = = null)
던져 새로운 내용 예외("오류: 로드할 수 없습니다. ASCX 파일!");

만약 (!.IsPostBack 페이지입니다.)
{

사용 하 여 (SPSite 사이트 = 새로운 내용 SPSite("http://localhost/enterprisedata"))
{
사용 하 여 (SPWeb 웹 사이트를 =. OpenWeb())
{

SPList currentList = 웹. 목록["기업의 위치"];

foreach (SPItem XYZZYCorporateLocation 에서 currentList.Items)
{
만약 (XYZZYCorporateLocation["제목"] == null) «««;

문자열 theTitle;
theTitle = XYZZYCorporateLocation["제목"].ToString();

.XYZZYCorporateLocationSelector.Items.Add
(새로운 내용 ListItem(theTitle, theTitle));

} // foreach

} // spweb 웹을 사용 하 여 site.openweb =()
} // spsite 사이트를 사용 하 여 새로운 spsite =("http://localhost/enterprisedata ")

} // 하지 않을 경우 포스트백

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

위의 코드는 기본적으로 WSS 사용자 지정 목록에 있는 값으로 DropDownList를 채우기 위한 논리를 구현 http://localhost/enterprisedata 및 명명 된 "기업 부서".

단일.cs 파일에 있는 두 클래스를 정의, 그것을 컴파일하고 GAC에 넣어 (강한 필요, 물론).

  1. 컨트롤 템플릿 구현 (.ascx) 같이:

<%@ 제어 언어= "C#" 상속="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,버전 12.0.0.0, 문화 = 중립 =,Publickeytoken 등 = 71e9bce111e9429c" compilationMode"항상 =" %>
<%
@ 등록 Tagprefix"wssawc =" Namespace="Microsoft.SharePoint.WebControls" 어셈블리="Microsoft.SharePoint, 버전 12.0.0.0 =, 문화 = 중립, Publickeytoken 등 = 71e9bce111e9429c" %> <%@ 등록 Tagprefix"SharePoint =" Namespace="Microsoft.SharePoint.WebControls" 어셈블리="Microsoft.SharePoint, 버전 12.0.0.0 =, 문화 = 중립, Publickeytoken 등 = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID"XYZZYCorporateLocationFieldControl =" runat"서버" =>
<서식 파일>
<asp:드롭다운 목록 ID"XYZZYCorporateLocationSelector =" runat"서버 =" />
</서식 파일>
</
SharePoint:RenderingTemplate>

위의 c에 저장 됩니다.:\프로그램 파일 공통 파일 마이크로 소프트 파일 서버 extensions12controltemplates.

  1. 마지막으로, 우리가 만들 XML 파일에 저장 하는... 12XML 디렉터리. 이것은 CAML 우리의 사용자 정의 데이터 형식을 정의 하 고 내 예, 이 처럼 보이는:

<?xml 버전="1.0" 인코딩="u t f-8" ?>
<
Fieldtype>
<
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[
<스팬 스타일 = "색상:레드 "><b>]]>
</
HTML>

<
SubColumnNumber="0" HTMLEncode="사실"/>

<HTML><![CDATA[</b></범위>]]></HTML>

</
기본>
</
스위치>

</
RenderPattern>
</
FieldType>
</
Fieldtype>
이 XML 파일 WSS "라이브러리에 사용자 지정 데이터 형식을 추가합니다" GAC에 대하여 일치 했다 어셈블리.

곳으로 모든이 비트를 이동한 후, 서버에서 iisreset 멋지게 작업 모든 시작을 한다.

3 "에 대한 생각모스: 기능 예-사용자 정의 데이터 형식

  1. 알 레 한 드
    안녕 폴,
    우선, 기사 주셔서 감사, 때문에 매우 흥미 롭 군요. 하나만 질문;
    목록의 데이터 시트 보기에서 사용자 지정 필드 형식을 올바르게 렌더링 posible 인지 아십니까?
    그것을 만드는 모든 사용자 정의 필드 형식 데이터 시트 보기에서 읽기 전용으로 표시 되어 있기 때문에 (그리고 MSDN, 예를 들어, 아주 많이 도와 되지 않습니다. :-S).
    감사
    회신
  2. Lyndsay

    솔루션을 구현 하려고 해요. 그러나 드롭다운 목록 대신 나, 단지 내가 한 DropDownChoiceList에 대 한 옵션. 당신이 항목을 DropDownChoiceList을 추가 하는 방법을 알고 어떻게 하나요? 우리는 SharePoint를 사용 하 여 2007 S p 1과 Visual Studio 2005 S P 1.

    회신

응답을 남기다

귀하의 이메일 주소는 공개되지 않습니다. 필요 입력 사항은 표시되어 있습니다 *