2011-04-13 62 views
6

在網上做了很多研究之後,我仍然被這個問題困住了。我有一個頁面將類別的名稱和計數加載到下拉列表中。我只在!(Page.IsPostBack)時這樣做。當AutoPostBack觸發SelectedIndex = 0。我嘗試了幾個不同的東西。這裏是我的代碼:Asp.NET DropDownList在回傳後重置SelectedIndex

PAGE

<form id="AddAssignmentForm" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" /> 

<asp:UpdatePanel ID="CommentUpdate" runat="server"> 
<ContentTemplate> 

Add Comment 
<asp:DropDownList ID="ddlCategory" runat="server" Width="206" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" AutoPostBack="true" /> 
<asp:TextBox ID="txtName" runat="server" Width="200" /> 
<asp:TextBox ID="txtAbbrv" runat="server" Width="200" /> 
<asp:TextBox ID="txtDescription" runat="server" Width="200" Height="90" TextMode="MultiLine" /> 

</ContentTemplate> 
</asp:UpdatePanel> 
</form> 

這裏是後端代碼。

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     GetCategories(); 
    } 
} 

public void GetCategories() 
{ 
    String strSql = @"SELECT Name, Total 
         FROM MyTable"; 

    if (con.State == ConnectionState.Closed) 
     con.Open(); 

    OleDbCommand cmdsql = new OleDbCommand(strSql, con); 
    OleDbDataReader cmdReader = cmdsql.ExecuteReader(); 

    if (cmdReader.HasRows) 
    { 
     while (cmdReader.Read()) 
     { 
      ddlCategory.Items.Add(new ListItem(cmdReader["Category_Name"].ToString(), cmdReader["Total"].ToString())); 

     } 
     ddlCategory.SelectedIndex = -1; 
    } 


    cmdReader.Close(); 
    con.Close(); 
} 

public void FillForm(int index) 
{ 
    ListItem item = ddlCategory.Items[index]; 
    txtName.Text = item.Text + " " + (Convert.ToInt32(item.Value) + 1).ToString(); 
    txtAbbrv.Text = item.Text.Substring(0, 1) + (Convert.ToInt32(item.Value) + 1).ToString(); 
} 

public void ddlCategory_SelectedIndexChanged(Object sender, EventArgs e) 
{ 
    //When I break here SelectedIndex always = 1. 
    FillForm(ddlCategory.SelectedIndex); 
} 

我只是想能夠根據選定的索引填充表單,但我似乎無法得到正確的答案。任何幫助表示讚賞。

+0

我假設你已經啓用視圖狀態?您是否檢查過請求以查看該控件返回的值是什麼?下拉菜單中有多少項目? – Dan 2011-04-13 21:49:52

+0

我很確定我遇到過這個問題。你可以嘗試使更新面板有條件,並設置異步回發觸發到DropDownLists selectedindex更改事件? – 2011-04-13 21:51:43

+0

現在在下拉菜單中有4個項目。我不確定你的意思是通過檢查請求來查看返回的值。我檢查了SelectedIndexChanged中的ddlCategory.SelectedIndex,它總是1. – Genzume 2011-04-13 21:53:13

回答

3

我發現了這個問題。從我的SQL語句填充的值包含重複的值。出於某種原因,這導致整個事件以奇怪的方式發生故障,這使得每當我選擇ListItem時整個列表都會重置。通過確保沒有重複的值,代碼開始工作完美。感謝大家的幫助。

1

您是否已啓用或禁用Viewstate? SelectedIndex是基於零的,所以它被重置,我認爲它將被設置爲零。

此外,下拉列表的其他屬性設置爲什麼?選定的值是否正確?

嘗試其他瀏覽器。我有一個級聯下拉的問題,它沒有在Firefox中正確觸發/行爲。

+0

ViewState已啓用。如果我禁用它,那麼我的列表將在PostBack上清除。 – Genzume 2011-04-13 21:49:43

+0

我在Internet Explorer中嘗試了它,並且遇到同樣的問題。現在,SelectedIndexChanged甚至沒有被觸發,因爲DropDownList只是在我改變它時重置爲最高選擇。 – Genzume 2011-04-13 22:02:19

+1

我發現了這個問題。從我的SQL語句填充的值包含重複的值。出於某種原因,這導致整個事情以怪異的方式發生故障。通過確保空值變爲0,代碼開始工作完美。感謝大家的幫助。 – Genzume 2011-04-13 22:42:45

11

添加AppendDataBoundItems =「真」下拉列表中

+2

這完全解決了我的問題!我從arraylist填充我的drowndownlist.datasource。這必然會混淆指數。設置appendatabounditems固定它wooooO!O !!# – austin 2013-02-19 01:34:02

+1

這是我的正確答案。 – Jono 2014-02-13 11:48:00

+0

正確答案!!! – 2016-01-04 10:34:07

0

我已經遇到了同樣的問題,我的下拉列表stateview跳轉到索引1直接從另一個控制回發事件之後。我的建議只是確保你的下拉列表的值不爲空

希望其幫助別人.... :)

+0

請詳細說明您的答案。這個問題沒有意義表明存在空值。 – 2013-02-14 09:29:08

2

確保您的值字段是每個下拉列表項目是獨一無二的。如果每個項目具有相同的值,則它將在索引0上默認。

1

嘗試爲DataValueField使用組合列值時,發生了這種情況。例如:

該存儲過程是這樣寫:

SELECT 
    Description, 
    Value1 + ',' + Value2 AS Value 
FROM 
    DropDownListTable 

而DataValueField使用這是由逗號分隔的值1和值2字段的組合的值字段。 (我也嘗試了管和無定界符,但有相同的結果)

With ddl 
    .DataTextField = "Description" 
    .DataValueField = "Value" 
    .DataSource = ds 
    .DataBind() 
End With 

只要我用值1或值2作爲DataValueField,問題消失。

0

我這個掙扎過,我試過EnableViewState="true" ViewStateMode="Enabled"但它實際上並不需要的,你只需要ADDD的IsPostBack在Page_Load事件。 不要忘記添加IsPostBack,就是這樣...

if (!IsPostBack) 
{ 
    LoadDropDown(); 
} 
0

你必須加載列表下拉列表如果沒有的IsPostBack

示例代碼:

if (!IsPostBack) 
{ 
    //fill here 
} 
相關問題