2011-05-02 122 views
1

我想我的下拉列表显示第一个值“ - 选择小车 - ”DROPDOWNLIST第一个值显示“选择”

我在这样成功:

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

,这是很正常的“ - 选择 - ”是摆在首位,但现在的问题是,如果我有值,例如,在下拉列表显示这样的:

-Choose car- 
Subaro 
Fiat 
Honda 

的第一个值,当我进入到网站,显示的是Subaro ,并看到 - 选择汽车 - 用户需要打开下拉列表,然后他会首先看到选择汽车。我怎样才能从一开始就做到这一点,从页面加载 - 选择汽车 - 将显示在ddl从页面加载。我在代码错误的地方?

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

+3

您是否尝试将'SelectedIndex'属性设置为'0'? – R0MANARMY 2011-05-02 11:12:43

+0

是的。同样的转折。 – Oshrib 2011-05-02 11:30:09

+0

如果该下拉列表已被绑定,则值可能来自数据库。它是绑定的吗? – Vale 2011-05-02 11:32:29

回答

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(); 

这将会把选择汽车文本在下降的第一个选项下拉列表并在其下面追加其他选项。


现在为为什么更有趣的部分你看到你看到的(非选择第一项)的行为。如果你使用像JustDecompile工具看看SelectedIndex执行(不与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 
    } 
} 

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

+0

谢谢大家。 在最后,问题是如此愚蠢:)...我有4个级联ddl的...所有我要做的就是添加任何他们的标记 - AppendDataBoundItems =“true”..并设置listitem的值为0! 下一步是要if(!ispostback){ddl2 .... clear(...)insert =“ - choose-”}在selectedindexchanged ..从原因,即使回发后,用户将看到选择。 现在一切正常。 所以问题是所有的ddl都与WHERE相互连接。为了避免错误,他们每个人都需要在列表项中使用AppendDataBoundItems =“true”和value = 0。 – Oshrib 2011-05-02 21:33:34

+0

@Bside:你可能应该提到他们是在你的问题中级联下拉菜单。不知道我的答案是否有助于你的情况。 – R0MANARMY 2011-05-02 21:40:12

1

你应该做ddl1.Items.Insert(0, new ListItem("-Choose car-", "-Choose car-"));第一,而且比ddl1.SelectedIndex = 0

+0

好的,我需要那样做?在ddl1_DataBound? 或在page_Load? – Oshrib 2011-05-02 11:49:17

+0

尝试在DataBound – Vale 2011-05-02 11:51:10

+0

我得到了错误:输入字符串没有正确的格式。 – Oshrib 2011-05-02 12:09:31

1
  1. 确保你绑定数据源和你“ - 选择转交”项目第一选择前插入他的第一个项目
  2. 确保当你插入你的第一个项目“选择车”,你每回发一次就没有。检查是否不是IsPostBack添加第1项。 编辑: 实施例:(!的IsPostBack)

    保护无效的Page_Load(对象发件人,EventArgs的) { 如果 { ddl1.Items.Insert(0,新的ListItem( “ - 选择小车 - ”,“ - 选择车 - “)); }

    ddl1.SelectedIndex = 0; 
    

    }

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){}调用它的页面加载。

+0

你认为可能问题是我使用LINQ to SQL? 我如何连接你在这里写的东西的ddl? – Oshrib 2011-05-02 11:58:39

+0

不,我不知道你如何绑定你的下拉列表,但我认为这是一个简单的方法来完成你想要的。 – 2011-05-02 12:01:49

+0

你仍然可以使用LINQ to SQL – 2011-05-02 12:12:41