2011-05-02 266 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

相關問題