2009-06-05 4 views
1

本質的に私の質問は次のとおりです。データバインドされたコントロールに値を設定する方法は2通りあります。このよう次のいずれかのDataBoundアイテムコントロールにアクセスする際の不一致

<asp:Label runat="server" id="MyLabel"><%#DataBinder.Eval(Container.DataItem, "MyValue")%></asp:Label> 

またはこの方法:

<asp:Label runat="server" id="MyLabel" text=<%#DataBinder.Eval(Container.DataItem, "MyValue")%> /> 

、MyLabel.Textを第一の方法を使用して(このデータバインディングが発生しているメソッドの外で)イベントハンドラのアイテムにアクセスしようとしています空の文字列です。しかし、2番目の方法を使用すると、MyLabel.Textは "MyValue"に等しくなります。なぜこのようなことが起こるのか教えてください。

答えて

1

ラベルのTextプロパティは、コントロールのマークアップの内側のテキストにマップされません。 Labelコントロールは他のコントロールのコンテナとして使用できます。つまり、子コントロールをタグの内側に配置します。

<%#...%>を使用してバインドしたときにテキストが空である理由は、バインドされたテキストがMyLabel.Controlsコレクションの子リテラルコントロールとしてレンダリングされているためです。この場合、テキストには

var myText = ((ITextControl)MyLabel.Controls[0]).Text; 
// instead of.. 
var myText = MyLabel.Text; 

にアクセスします。ラベルのテキストにアクセスするには、常にTextプロパティを使用します。ラベルにコントロールをネストする場合は、タグをマークアップタグの間に入れます。

0

2番目の例では、TextLabelコントロールのプロパティであり、直接設定するのに対し、最初の例ではTextプロパティを設定していないため、これを確認したリフレクターで簡単に見:Labelはそれにいくつかの子コンテンツを持っている場合、それは、HTMLにレンダリングされたコンテンツである(しかし、それは決してませんあなただけ... Label

EDITを子を追加していますTextプロパティに設定します)。それ以外の場合は、レンダリングされるのはTextプロパティの内容です。