下拉列表的第一个值显示为“选择”

Osh*_*rib 2 c# asp.net drop-down-menu

我希望我的下拉列表显示第一个值:“-choose car-”

我以这种方式成功:

protected void ddl1_DataBound(object sender, EventArgs e)  
{
    Convert.ToInt32(ddl1.SelectedValue); 
    ddl1.Items.Insert(0, new ListItem("-Choose car-", "-Choose car-"  )); 
}
Run Code Online (Sandbox Code Playgroud)

没关系,“-choose-”放在首位,但是现在的问题是,例如,如果我有值,则下拉列表显示如下:

-Choose car-
Subaro
Fiat
Honda
Run Code Online (Sandbox Code Playgroud)

我进入该站点时显示的第一个值是Subaro,要看到-choose car-,用户需要打开下拉列表,然后他会首先看到-choose car-。从一开始就从页面加载开始--choose car-将在页面加载后显示在ddl上。我在哪里弄错了代码?

我尝试使用的项目列表,AppendDataBoundItems = "true"但出现错误,当我成功时,问题与我之前说的相同。

R0M*_*RMY 5

使用AppendDataBoundItems属性使true您处在正确的轨道上,如果要绑定列表,则应将其设置为。

您的标记应如下所示

<asp:DropDownList runat="server" ID="ddl1" AppendDataBoundItems="true">
    <asp:ListItem Text="-Choose car-" />
</asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)

并且您后面的代码可能已经看起来像这样

ddl1.DataSource = [your datasource goes here];
ddl1.DataBind();
Run Code Online (Sandbox Code Playgroud)

这会将“ 选择汽车文字”作为第一个选项放在下拉列表中,并将其余选项附加在其下方。


现在,对于为什么看到现象的更有趣的部分(未选择第一项)。如果您看一下SelectedIndex使用JustDecompile之类的工具(不隶属于Telerik,只是碰巧使用了他们的工具)的实现,您将看到如下代码:

public int SelectedIndex
{
    get
    {
        int num = 0;
        num++;
        while (num < this.Items.Count)
        {
            if (this.Items[num].Selected)
            {
                return num;
            }
        }
        return -1;
    }
    set
    {
        // stuff you don't care about

        this.ClearSelection();
        if (value >= 0)
        {
            this.Items[value].Selected = true;
        }

        // more stuff you don't care about
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,索引不会存储在任何地方,它是根据Selected属性设置为true的项每次计算的。当您将SelectedIndex标记中的设置为0并与数据源进行数据绑定时,对于您的情况,它将选择该列表中的第0个项目Subaro。当您在列表的开头插入新项目时,Subaro仍将其标记为选定项目,这就是为什么在页面加载时会看到已选定而不是的原因Choose car。如果要Choose car使用代码将其标记为选定的项目,则必须在对数据进行下拉列表数据绑定后执行此操作。 请注意,这只是DropdownList工作原理的实现细节。它可能会在将来的ASP.NET版本中更改,因此请不要编写以此方式工作依赖它的代码。