I'm working on an old project written and then patched by several people over the years. At some places they have used SelectedValue property and other places they used SelectedItem.Value.
Question: Is SelectedValue
just a syntactic sugar for SelectedItem.Value
or SelectedValue
works differently under the hood? Which one performs better?
Edit: SelectedItem.Text was replaced with SelectedItem.Value
SelectedValue
returns the same value as SelectedItem.Value
.
SelectedItem.Value
and SelectedItem.Text
might have different values and the performance is not a factor here, only the meanings of these properties matters.
<asp:DropDownList runat="server" ID="ddlUserTypes">
<asp:ListItem Text="Admins" Value="1" Selected="true" />
<asp:ListItem Text="Users" Value="2"/>
</asp:DropDownList>
Here, ddlUserTypes.SelectedItem.Value == ddlUserTypes.SelectedValue
and both would return the value "1".
ddlUserTypes.SelectedItem.Text
would return "Admins", which is different from ddlUserTypes.SelectedValue
edit
under the hood, SelectedValue looks like this
public virtual string SelectedValue
{
get
{
int selectedIndex = this.SelectedIndex;
if (selectedIndex >= 0)
{
return this.Items[selectedIndex].Value;
}
return string.Empty;
}
}
and SelectedItem looks like this:
public virtual ListItem SelectedItem
{
get
{
int selectedIndex = this.SelectedIndex;
if (selectedIndex >= 0)
{
return this.Items[selectedIndex];
}
return null;
}
}
One major difference between these two properties is that the SelectedValue
has a setter also, since SelectedItem
doesn't. The getter of SelectedValue
is faster when writing code, and the problem of execution performance has no real reason to be discussed. Also a big advantage of SelectedValue is when using Binding expressions.
edit data binding scenario (you can't use SelectedItem.Value)
<asp:Repeater runat="server">
<ItemTemplate>
<asp:DropDownList ID="ddlCategories" runat="server"
SelectedValue='<%# Eval("CategoryId")%>'>
</asp:DropDownList>
</ItemTemplate>
</asp:Repeater>