DropDownList的SelectedValue与SelectedItem.Value有何区别?

44
我正在处理一个由多人编写和修补多年的旧项目。在某些地方,他们使用了SelectedValue属性,在其他地方则使用了SelectedItem.Value。
问题: SelectedValue只是语法糖用于SelectedItem.ValueSelectedValue在底层工作方式上有所不同?哪一个表现更好?
编辑: SelectedItem.Text已被替换为SelectedItem.Value。
5个回答

63

SelectedValue 返回与 SelectedItem.Value 相同的值。

SelectedItem.ValueSelectedItem.Text 可能具有不同的值,性能在此处不是一个因素,只有这些属性的含义才重要。

<asp:DropDownList runat="server" ID="ddlUserTypes">
    <asp:ListItem Text="Admins" Value="1" Selected="true" />
    <asp:ListItem Text="Users" Value="2"/>
</asp:DropDownList>

在这里,ddlUserTypes.SelectedItem.Value == ddlUserTypes.SelectedValue,两者都会返回值"1"。

ddlUserTypes.SelectedItem.Text将返回"Admins",与ddlUserTypes.SelectedValue不同。

编辑

实际上,SelectedValue看起来像这样:

public virtual string SelectedValue
{
    get
    {
        int selectedIndex = this.SelectedIndex;
        if (selectedIndex >= 0)
        {
            return this.Items[selectedIndex].Value;
        }
        return string.Empty;
    }
}

而SelectedItem看起来像这样:

public virtual ListItem SelectedItem
{
    get
    {
        int selectedIndex = this.SelectedIndex;
        if (selectedIndex >= 0)
        {
            return this.Items[selectedIndex];
        }
        return null;
    }
}
这两个属性的一个主要区别在于,SelectedValue 有一个 setter,而 SelectedItem 没有。在编写代码时,SelectedValuegetter 更快,执行性能问题没有真正的讨论必要。此外,在使用绑定表达式时,SelectedValue 的巨大优势也体现出来了。

编辑 数据绑定场景(无法使用 SelectedItem.Value)

<asp:Repeater runat="server">
 <ItemTemplate>
     <asp:DropDownList ID="ddlCategories" runat="server" 
                       SelectedValue='<%# Eval("CategoryId")%>'>
     </asp:DropDownList>
 </ItemTemplate>
</asp:Repeater>

谢谢你指出来。我误打成了.Text,实际上.Value 在所有地方都被使用。所以,这两个属性(SelectedItem.Value 和 SelectedValue)的内部实现是相同的吗?相对于一跳即可到达的 SelectedValue,SelectedItem(两个点)语法更加复杂吗? - vulcan raven
谢谢Adrian。你能详细介绍一下绑定表达式的优势吗?我会非常感激! - vulcan raven
@vulcanraven,欢迎,我已经更新了答案,并提供了一个数据绑定的示例。 - Adrian Iftode
我不确定你的“底层”部分是否正确。我刚刚发现SelectedItem将根据其值选择一个项目,而不是索引。这意味着如果您有多个具有相同Value的项目,则可能SelectedItem返回错误的项目。 - Rachel
我使用了Reflector来查看它。 - Adrian Iftode

9

这两者之间的一个重要区别(在反映的代码中可见)是,如果未选择任何内容,则SelectedValue将返回一个空字符串,而SelectedItem.Value会抛出NullReference异常。


4

它们是不同的。 SelectedValue 属性给出了选择项的实际值,而 SelectedItem.Text 给出了显示文本。例如:您的下拉列表可能有一个项目:

<asp:ListItem Text="German" Value="de"></asp:ListItem>

因此,在这种情况下,SelectedValue将是de,而SelectedItem.Text将给出“德语”。
编辑:
在这种情况下,它们都是相同的......因为SelectedValue将为您的下拉列表中当前选择的项目存储的值,并且SelectedItem.Value将是当前选择的项目的值。
因此,它们都会给您相同的结果。

0

使用SelectedItem.Text时要小心... 如果没有选中任何项,那么SelectedItem将为null,而SelectedItem.Text将生成一个空值异常。

.NET应该提供一个类似于SelectedValue属性的SelectedText属性,当没有选定项时返回String.Empty。


0
在下拉列表中有两个项目添加属性。
1)文本 2)值
如果您想获取文本属性,则使用selecteditem.text
如果您想选择值属性,则使用selectedvalue属性
在您的情况下,我认为值和文本属性是相同的,因此无论您使用selectedvalue还是selecteditem.text都没有关系
如果两者不同,则它们会给我们不同的结果

这个注释有点令人困惑。是的,selectedValue属性和selectedItem.Text可以相同,但很多时候它们并不相同,就像上面的例子中SelectedValue是“de”,而SelectedItem.Text是“German”,或者SelectedValue是“CA”,而SelectedItem.Text是“California”。最常见的情况是,SelectedValue是数据库主键值的字符串表示形式,而SelectedItem.Text是同一行DB表中特定列的值。 - Bruce Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接