2010-09-28 53 views
5

我填充DropDownList控件如下 -ASP.NET DropDownList的問題:的SelectedItem沒有改變

public partial class UserControls_PMS_Send2DeliveryTeam : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
      // SA 100928 Get the delivery teams and their respective email addresses 
      string[] delTeam = ConfigurationManager 
           .AppSettings["deliveryTeamNames"] 
           .Split(','); 
      string[] delTeamEmails = ConfigurationManager 
            .AppSettings["deliveryTeamEmails"] 
            .Split('|'); 

      if (delTeam.Length != delTeamEmails.Length) 
      { 
       showAlert("You have an error in the configuration of the delivery teams"); 
       return; 
      } 

      for(int looper=0; looper<delTeam.Length; looper++) 
       delTeamDDList 
       .Items 
       .Add 
       ( 
        new ListItem(delTeam[looper], delTeamEmails[looper]) 
       ); 

     } 

    // Other methods 
} 

但是每當用戶從該下拉列表的值,被選擇僅在第一項。爲了更清楚地說明,假設列表有4項,item 1,item 2,item 3item 4。當用戶從列表中選擇第4項時,它將選擇item 1作爲選定值。

這是什麼原因?

編輯

我剛纔檢查生成的HTML使用螢火蟲DropDownList的,而且似乎「選擇」值不能使用,即使我選擇從DropDownList中不同的值都發生改變。

生成的HTML是如下 -

<select class="select" id="Send2DeliveryTeam_delTeamDDList" name="Send2DeliveryTeam$delTeamDDList"> 
    <option value="value1" selected="selected">Project Initiation Team</option> 
    <option value="value2">Service Delivery Centre</option> 
    <option value="value3">TCS</option> 
    <option value="value4">PIT &amp; SDC</option> 
    <option value="value5">SDC &amp; TCS</option> 
    <option value="value6">PIT &amp; TCS</option> 
    <option value="value7">PIT &amp; SDC &amp; TCS</option> 
</select> 

首先,用戶從該下拉列表的值。然後他按下一個按鈕,觸發點擊事件。該按鈕的相應事件處理函數是我訪問下拉列表的選定值的地方。代碼如下 -

// Button event-handler code 
protected void assignDelTeamButton_Click(object sender, EventArgs e) 
{ 
    // This is where I am always getting the same value, no matther what I choose 
    // from the dropdown list, and this value is the one which is selected by default 
    // when the page loads. I mean, the "SelectedIndex" is always 0. 
    string selected_value = delTeamDDList.SelectedItem.ToString(); 

    // Other codes 
} 

的ASCX文件 -

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Send2DeliveryTeam.ascx.cs" Inherits="UserControls_PMS_Send2DeliveryTeam" %> 
<div id="Common"> 
    <h3>Welcome <%string user = HttpContext.Current.Session["user_name"].ToString();%><%=user %></h3> 
    <h1>Request Estimate Screen</h1> 
    <span>Request Estimate and Assign a Delivery team to a Request</span><br /> 
    <label>Enter an existing project number</label> 
    <asp:TextBox ID="reqNum" runat="server" CssClass="textBox" /><br /> 
    <label>Select Delivery Team</label> 
    <asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" > 

    </asp:DropDownList> 
    <label> - Sorted in alpha order</label><br /><br /> 
    <label>&nbsp;</label> 
    <asp:button ID="assignDelTeamButton" runat="server" Text="Continue" 
    CssClass="button" onclick="assignDelTeamButton_Click"/><br /> 
</div> 

第二個編輯

如果我硬編碼時listItems如下,它完美的作品 -

<asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" > 
    <asp:ListItem Text="Project Initiation Team" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="Service Delivery Centre" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="SDC & TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC & TCS" Value="[email protected]"></asp:ListItem> 
</asp:DropDownList> 
+0

呈現的HTML看起來像什麼?什麼是呈現的關鍵/值對?這是說 - 基於一個集合循環時要小心,並添加一個基於該集合和另一個鍵/值。 – RPM1984 2010-09-28 04:52:04

+0

@RPM:請參閱編輯。 – 2010-09-28 05:01:25

+0

@Night Shade - 你能提供原始的HTML嗎?我想看看實際的HTML看起來像什麼,然後再進入「選定的項目」。讓我們看看它的有效html。即時銀行沒​​有。 – RPM1984 2010-09-28 05:04:14

回答

8

執行下列操作之一:

  1. 打開ViewState的Web.config文件或包含網頁,如果它是關在那裏。
  2. 更好的是,確保ViewState仍然處於啓用狀態,但是將DDL填充到用戶控件的Init(但不包括!IsPostBack)中。這將在每個頁面/控件初始化(即使在回發)上都有您的數據訪問邏輯,但它不會向ViewState添加不必要的數據,因爲您沒有初始化DLL,然後讓ViewState跟蹤您對其數據所做的更改資源。但是,您仍然需要ViewState,因爲ASP.NET中的DDL需要ViewState才能在回發中跟蹤所選的索引/值(如果您完全關閉ViewState,則只能通過在發佈的請求的FORM中找到它來獲取DDL的回發選定值NameValueCollection中)。
7

如果您在頁面加載時進行此操作,請確保您已加入它在if(!IsPostBack){...}

+0

是的,我已經做到了。還是行不通。 – 2010-09-28 05:29:24

+0

@Night Shade。明確你在這裏做什麼,你在頁面上有一個「提交」按鈕,或者你的DDL上有AutoPostBack = true。當你說「只有第一個被選中」時,你意味着什麼 - 從提交表單之後的代碼隱藏或客戶端。因爲正如我在我的評論中所說的,當你做出選擇時,View Source/inspect元素中的HTML不會被更新,因爲這是一個客戶端事件(HTML無法看到這一點),只有當你提交表單時,你會看到選定的值(或者用JS調試) – RPM1984 2010-09-28 05:33:25

+0

@RPM:我認爲現在應該清楚了。 – 2010-09-28 05:40:42

4

如何將userControl添加到頁面?你是否在動態使用LoadControl("...Send2DeliveryTeam.ascx");技術?如果是這樣,請確保在您的aspx頁面Page_Init處理程序中調用LoadControl。任何後來,ViewState將無法應用於控件中的ddl,並且選擇將會丟失。

此外,請注意,如果您在控件上設置Visible = false,它將不會被渲染。你在哪種情況下做這件事?

+0

用戶控件已經在該頁面中。我只是使其可見/不可見。 – 2010-10-01 18:57:35

+0

你的邏輯在哪裏可見/不可見?在.aspx或.ascx上?你在什麼情況下改變了能見度? – TheGeekYouNeed 2010-10-01 22:54:54

2

而不是使用SelectedItem嘗試使用SelectedText。我在C#win-forms應用程序中遇到了同樣的問題,儘管您會認爲(至少我確實)SelectedText會向下拉菜單中添加文本,但實際上它會選擇帶有該文本的項目。

希望這會有所幫助。

+0

有趣,但讀你的答案爲我打開燈泡。這裏我們是7年後,我仍然需要vb.net。我試圖設置.SelectedIndex = 8,因爲上面的下拉列表讓我這樣做。那麼,SelectedIndex是一個位置,而不是一個值。所以我改變了代碼設置.SelectedValue = 8,它的工作原理。我的ddl的索引是0-8,但是我的問題只有索引0-7。謝謝 – JustJohn 2017-04-23 18:57:26