2011-07-27 11 views
0

テンプレートのカスタムコントロールをC#で作成しようとしていますが、ASP.NETにはアイテムのコレクションが含まれています。 ASP.NETの組み込みのDropDownListコントロールと同様に使用したいと思いますが、アイテムには異なるプロパティがあります。IParserAccessorインターフェイスをカスタムASP.NETコントロールで使用する方法

DropDownListコントロール(または任意のリストコントロール)内のアイテムを表すのに使用されるListItemクラスがIParserAccessorインターフェイスを実装していることに気付きました。このインターフェイスを実装する必要がありますか、そのAddParsedSubObject(object obj)で何をすればよいですか。私はインターネットを検索しましたが、その例や良い説明が見つかりませんでした。

私のカスタムコントロールのアイテムは、そのインターフェイスを実装せずに作成されると仮定していますが、それでも好奇心の理由から、詳細を知ってうれしいです。

答えて

2

あなたが話しているような機能を得るためにIParserAccessorを実装する必要はありません。代わりに、サーバーコントロール内の子コントロール(アイテムと呼ぶ)を保持するコレクションを作成し、DefaultProperty値として "Items"を持つサーバーコントロールにParseChildren属性を適用します。

次のリンクはParseChildrenを実装する方法についての例が含まれていますIParserAccessor上
http://msdn.microsoft.com/en-us/library/aa310907(v=vs.71).aspx

更新
情報:

から:http://msdn.microsoft.com/en-us/library/system.web.ui.iparseraccessor.aspx

Controlクラスの実装しているのでこのインターフェイスは、より簡単です そのクラスを拡張して、このインターフェイスを自分で実装するよりも、 AddParsedSubObjectメソッドの実装をオーバーライドします。 http://forums.asp.net/t/879797.aspx/1(imagemakerの記事を参照してください):から

AddParsedSubObjectのは、IParserAccessor インタフェースの唯一の方法です。 IParserAccessorインターフェイスは、Controlと によってすべてのクラスがControlおよびListItemクラスを継承して実装されています。子コントロールまたは IParserAccessorインターフェイスを実装するサーバーコントロールの要素がHTMLから解析される場合、 AddParsedSubObjectの方法は、以下の方法 シグネチャと呼ばれる は次の

VB - サブAddParsedSubObjectの(オブジェクトとしてByVal OBJ)
C# - void AddParsedSubObject(object obj)

objパラメータは、解析されたオブジェクト を表します。カスタムサーバーコントロールでオーバーライドされた AddParsedSubObjectメソッドを使用すると、objの種類を確認して をキャストして、リテラルコントロールや を特定の子要素としてキャストして処理することができます。子コントロールに追加する コレクション、アイテムのコレクションまたは何でも。

ここでは、同じポストからexamleです:私が最初にIParserAccessor インタフェースとAddParsedSubObjectのを実装するために必要な含ま 子要素のためのクラスを定義していたに対処するに走った

その内側の内容として文字列:

<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クラスで、私はその を上書きするために必要な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

努力してくれてありがとう、それはまさに私が探していた情報でした。 –

関連する問題