2011-07-27 3 views
0

C#에서 템플릿 사용자 지정 컨트롤을 작성하려고합니다. ASP.NET에는 항목 모음이 있습니다. ASP.NET에서 내장 된 DropDownList 컨트롤과 비슷하게 사용하고 싶지만 내 항목에는 다른 속성이 있습니다.IParserAccessor 인터페이스를 사용자 지정 ASP.NET 컨트롤에서 사용하는 방법

DropDownList 컨트롤 (또는 모든 목록 컨트롤)의 항목을 나타내는 데 사용되는 ListItem 클래스가 IParserAccessor 인터페이스를 구현하는 것으로 나타났습니다. 이 인터페이스는 언제 구현해야합니까? AddParsedSubObject(object obj)에서 무엇을해야합니까? 나는 인터넷을 검색했지만 예제 나 좋은 설명을 찾을 수 없었다.

내 사용자 지정 컨트롤의 항목이 해당 인터페이스를 구현하지 않고도 만들 것이라고 가정하지만, 호기심 때문에 더 자세히 알게되어 기쁩니다.

답변

2

IParserAccessor를 구현하지 않아도되는 것과 같은 기능을 얻을 수 있습니다. 대신 서버 컨트롤에서 자식 컨트롤 (Items라고 부름)을 보유 할 컬렉션을 만들고 서버 컨트롤에 DefaultProperty 값으로 "Items"를 사용하여 ParseChildren 특성을 적용하십시오. IParserAccessor에
http://msdn.microsoft.com/en-us/library/aa310907(v=vs.71).aspx

업데이트
정보 :에서

:

다음 링크는 ParseChildren 구현하는 방법에 대한 예제가 들어 http://msdn.microsoft.com/en-us/library/system.web.ui.iparseraccessor.aspx

을 컨트롤 클래스가 구현 때문에 이 인터페이스는 더 쉽습니다. 이 클래스를 확장하고 직접이 인터페이스를 구현하는 것보다 AddParsedSubObject 메서드 구현을 재정의하십시오. 에서

: http://forums.asp.net/t/879797.aspx/1 (imagemaker의 게시물을 참조)

AddParsedSubObject은 IParserAccessor 인터페이스의 유일한 방법입니다. IParserAccessor 인터페이스는 Control과 에 의해 구현되며 Control 클래스와 ListItem 클래스를 상속합니다. 자식 컨트롤 또는 IParserAccessor 인터페이스를 구현하는 서버 컨트롤의 요소가 HTML에서 구문 분석 할 때, AddParsedSubObject 방법은 다음과 같은 방법 서명이라고 은 다음과

VB - 하위 AddParsedSubObject (개체로 ByVal의의 OBJ)
void AddParsedSubObject (object obj)

obj 매개 변수는 구문 분석 된 개체를 나타냅니다. 사용자 지정 서버 컨트롤에서 재정의 된 AddParsedSubObject 메서드를 사용하면 obj의 형식을 확인한 다음 리터럴 컨트롤 또는 을 특정 자식 요소로 캐스팅하고 적절하게 처리 할 수 ​​있습니다. 자식 컨트롤 컬렉션에 추가하여, 항목 수집 또는 뭐든간에.내가 처음 IParserAccessor 인터페이스와 AddParsedSubObject를 구현하는 처리로 실행

포함하는 데 필요한 자식 요소의 클래스를 정의했다 : 여기

같은 포스트에서 examle입니다 그 내부 콘텐츠와 캐릭터 :

<WESNet:StyledList id="StyledList1" runat="server">  
<WESNet:StyledItem Value="2" ForeColor="red">Two</WESNet:StyledItem> 
<WESNet:StyledItem Value="5" 
ForeColor="green">Five</WESNet:StyledItem></WESNet:StyledList>Because 

내 다음과 같이 StyledItem 클래스는 Control에서 상속하지 않았다, 나는 IParserAccessor하고 AddParsedSubObject를 구현했다 :

Protected Sub AddParsedSubObject(ByVal obj As Object) Implements IParserAccessor.AddParsedSubObject 
    If TypeOf obj Is LiteralControl Then 
     Me.Text = CType(obj, LiteralControl).Text 
    Else 
     Throw New ArgumentException("Inner content of StyledItem must contain only static text") 
    End If 
End Sub 

그런 다음, (WebControl에서 상 속됨) 내 StyledList 클래스에, 나는 그것의 를 오버라이드 (override) 할 필요 AddParsedSubObject 방법은 다음과 같다 :

Protected Overrides Sub AddParsedSubObject(ByVal obj As Object) 
    If TypeOf obj Is StyledItem Then 
     Dim si As StyledItem = CType(obj, StyledItem) 
     Items.Add(si) 
    Else 
     Throw New ArgumentException ("A StyledList server control may contain only StyledItems") 
    End If 
End Sub 

여기에, 검사 후에 그 obj는 StyledItem입니다. 이것은 컨트롤의 Items 컬렉션 인 에 추가됩니다.

+0

귀하의 회신에 감사드립니다. 여전히'IParserAccessor' 인터페이스에 대해 더 많이 알게되어 기쁘다. 우선 호기심 때문에 말했듯이, 그 사용 예가 바람직하다. 아마 파싱하는 아이들과 관련이있는 것 같아요. 아마도 각 어린이가 맞춤 구문 분석 로직을 제공 할 수는 있지만 사용법에 대한 좋은 예는 찾을 수 없습니다. 현재'ParseChildren' 속성은 내가 필요한 것을해야합니다. –

+0

@Ivaylo Slavov - 게시했습니다. – Peter

+0

노력에 감사드립니다. 그 정보는 내가 찾고있는 정보와 정확히 일치합니다. –

관련 문제