2011-08-29 41 views
2

我有下面這段代碼:的ASP.NET下拉列表的selectedIndex不工作

DataRow CreateRow(DataTable dt, string name, string country) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["Name"] = name; 
     dr["Country"] = country; 
     return dr; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     // creating the data table 
     DataTable dt = new DataTable("Student Details"); 

     // adding two columns Name and Country 
     dt.Columns.Add("Name", typeof(String)); 
     dt.Columns.Add("Country", typeof(String)); 

     // create 3 rows   
     dt.Rows.Add(CreateRow(dt, "Varun", "India")); 
     dt.Rows.Add(CreateRow(dt, "Li", "China")); 
     dt.Rows.Add(CreateRow(dt, "Yishan", "China")); 

     // create a data view 
     DataView dv = new DataView(dt); 

     DropDownList1.DataSource = dv; 
     DropDownList1.DataTextField = "Name"; 
     DropDownList1.DataValueField = "Country"; 
     DropDownList1.DataBind(); 
    } 
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     int x = DropDownList1.SelectedIndex; 
     int temp = 0; 
     temp++; 
    } 

和標記看起來是這樣的:

<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:Label ID="Label1" runat="server"></asp:Label> 
     <br /> 
     <br /> 
     <asp:DropDownList ID="DropDownList1" runat="server" 
      onselectedindexchanged="DropDownList1_SelectedIndexChanged" 
      AutoPostBack="true"> 
     </asp:DropDownList> 

    </div> 
    </form> 
</body> 

的問題是,標籤總是顯示Varun的不管我選擇的是什麼。我調試了代碼,發現「DropDownList1.SelectedIndex」總是返回0出於某種原因。

我不知道爲什麼會發生這種情況。每當我從下拉列表中選擇某個東西時,函數「DropDownList1_SelectedIndexChanged」就會被調用。

感謝

回答

6

看起來你是在Page_Load下結合的下降...

請記住,當下拉發生變化時,它回發(的AutoPostBack =「真」),和因爲你在Page_Load上有約束力,它會簡單地重新綁定索引被更改的時間...不是你想要的!

你應該做這樣的事情:

if (!IsPostBack) 
{ 
    BindDropDownList1();  
} 
+0

謝謝c0deNinja!這解決了問題。 – VVV

1

確保ViewState是啓用(變更事件),並在OnLoadOnInit移動代碼。這將防止ViewState被覆蓋,因爲它在Init和Load之前發生。

(可選)您還應該將初始化代碼包裝在IsPostback檢查中,以避免必須在每個請求上加載數據。

+0

感謝TheCodeKing的替代方案。 – VVV

1

您可以使用此代碼:

foreach (ListItem item in DropDownList1.Items) 
    { 
      if (item.Text == defaultText) 
      { 
       item.Selected = true; 
       break; 
      } 
    } 
1

你可以嘗試重寫頁面的OnPreRender方法:

protected override OnPreRender(EventArgs e) 
{ 
    DropDownList1.SelectedIndex = Convert.ToInt32(ViewState["PageIndex"]); 

    base.OnPreRender(e); 
} 

同時,確保EnableViewState設置爲True