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

时间:2011-05-02 11:04:11

标签: c# asp.net drop-down-menu

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

我以这种方式取得成功:

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

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

-Choose car-
Subaro
Fiat
Honda

当我进入网站时显示的第一个值是Subaro,并且要查看-choose car-用户需要打开下拉列表,然后他会在第一个位置看到-choose car-。我怎么能从一开始就做这个,从页面加载 - -choose car-将在页面加载的ddl上显示。我在代码中出错了吗?

我用AppendDataBoundItems = "true"尝试了项目列表,但是我收到了错误,当我成功时,问题就像我之前说过的那样。

4 个答案:

答案 0 :(得分:4)

使用AppendDataBoundItems属性时,您处于正确的轨道上,如果您要对列表进行数据绑定,则应将其设置为true

您的标记应如下所示

<asp:DropDownList runat="server" ID="ddl1" AppendDataBoundItems="true">
    <asp:ListItem Text="-Choose car-" />
</asp:DropDownList>

你的代码可能看起来像这样

ddl1.DataSource = [your datasource goes here];
ddl1.DataBind();

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


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

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
    }
}

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

答案 1 :(得分:2)

  1. 确保绑定数据源并在选择第一项之前先插入“-choose care-”项目
  2. 确保当您插入第一个项目“-Choose car-”时,不要在每个PostBack上进行一次。检查是否IsPostBack添加第1项。 编辑: 例如:

    protected void Page_Load(object sender,EventArgs e) {    如果(!的IsPostBack)    {       ddl1.Items.Insert(0,new ListItem(“ - 选择car-”,“ - 选择car-”));    }

    ddl1.SelectedIndex = 0;
    

    }

答案 2 :(得分:1)

您应首先ddl1.Items.Insert(0, new ListItem("-Choose car-", "-Choose car-"));,而不是ddl1.SelectedIndex = 0

答案 3 :(得分:0)

        private void FillCar()
        {      
            DataTable dt = GetCar();
            ddl1.Items.Clear();
            ddl1.DataSource = dt;
            ddl1.DataTextField = "carName"; // field name in the database
            ddl1.DataValueField = "CarNum"; // field name in the database
            ddl1.DataBind();
            ListItem li = new ListItem();
            li.Text = "--Choose car--";
            li.Value = "-1";
            ddl1.Items.Insert(0, li);
            ddl1.SelectedIndex = 0;
        }

我使用这样的方法并在if (!IsPostBack){}中的页面加载中调用它。