List controls deriving from ListControl
, such as DropDownList
, ListBox
or RadioButtonList
, are populated by a list of ListItem
s. A ListItem
has a Value
and a Text
property.
ListControl
offers the following methods to access the currently selected item:
ListControl.SelectedItem
returns the currently selectedListItem
,ListControl.SelectedValue
returns theValue
property of the currently selectedListItem
.
Now, the interesting thing is:
ListControl.Text
returns exactly the same value asListControl.SelectedValue
. It does not returnSelectedItem.Text
, as one might expect.
This is by design:
ListControl.Text Property
Gets or sets the SelectedValue property of the ListControl control.
[...]
Remarks
The Text property gets and sets the same value that the SelectedValue property does.
This seems counter-intuitive and confuses people. My question is: Why was it done this way? I can imagine that providing a Text
property is necessary for implementing the ITextControl
interface, but why on earth would you choose to have it return the Value
of the ListItem rather than the Text
?
I checked that out before using .NET Reflector. If ListItem.Text is null, it returns ListItem.Value instead; if that is null, it returns an empty string. It works in vice versa for ListItem.Value too. So it's not the ListControl doing this, it's selected item itself.
HTH.
If the code used to process an ASPX page defines all controls using the
ITextControl
interface, theText
property is the only property available. When processing aListControl
, most of the business logic I write cares about the value of the selected item, not the text. Thus, in my opinion, the current behavior is the desired behavior, even if it is not necessarily the expected behavior.