2010-09-28 47 views
5

Tôi Populating một điều khiển DropDownList như sau -ASP.NET DropDownList vấn đề: SelectedItem không thay đổi

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 
} 

Nhưng bất cứ khi nào người dùng chọn một giá trị từ danh sách thả xuống này, chỉ mục đầu tiên đã được lựa chọn. Để làm rõ hơn, giả sử danh sách có 4 mục, item 1, item 2, item 3item 4. Khi người dùng chọn mục thứ 4 từ danh sách, nó chọn item 1 làm giá trị đã chọn.

Lý do đằng sau điều này là gì?

EDIT

Tôi vừa kiểm tra mã HTML được tạo ra cho DropDownList sử dụng firebug, và có vẻ như giá trị "được chọn" không thay đổi ở tất cả thậm chí nếu tôi chọn giá trị khác nhau từ DropDownList.

HTML được tạo như sau -

<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> 

Đầu tiên, người dùng chọn một giá trị từ danh sách thả xuống này. Sau đó, anh ấy nhấn một nút, sẽ kích hoạt sự kiện nhấp chuột. Chức năng xử lý sự kiện tương ứng của nút là nơi tôi đang truy cập vào giá trị đã chọn của danh sách thả xuống. Mã này là như sau -

// 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 
} 

các file 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> 

Second Sửa

Nếu tôi cứng mã ListItems như sau, nó hoạt động một cách hoàn hảo -

<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 hiển thị trông như thế nào? whats cặp khóa/giá trị được hiển thị? đang được nói - hãy cẩn thận khi lặp dựa trên một bộ sưu tập và thêm khóa/giá trị dựa trên bộ sưu tập đó VÀ một bộ sưu tập khác. – RPM1984

+0

@ RPM: Vui lòng xem chỉnh sửa. –

+0

@Night Shade - bạn có thể cung cấp HTML thô không? tôi muốn xem HTML thực tế trông như thế nào trước khi bạn vào "mục đã chọn". chúng ta hãy xem nếu html hợp lệ của nó. im ngân hàng trên không. – RPM1984

Trả lời

8

Thực hiện một trong các cách sau:

  1. Bật ViewState trong Web.config hoặc chứa trang nếu nó chờ thêm nữa.
  2. Tốt hơn, hãy đảm bảo ViewState vẫn được bật, nhưng điền DDL của bạn vào Init của người dùng (nhưng đừng bao bọc nó với! IsPostBack). Điều này sẽ có logic truy cập dữ liệu của bạn trên mọi trang/điều khiển init, ngay cả khi postback, nhưng nó sẽ không thêm dữ liệu không cần thiết vào ViewState khi bạn không khởi tạo DLL của bạn, sau đó có ViewState theo dõi những thay đổi bạn thực hiện với dữ liệu của nó nguồn. Tuy nhiên, bạn vẫn muốn ViewState vì DDL trong ASP.NET yêu cầu ViewState để theo dõi chỉ mục/giá trị đã chọn trên postback (nếu bạn tắt hoàn toàn ViewState, bạn chỉ có thể nhận được DDL được đăng lại giá trị đã chọn bằng cách tìm nó NameValueCollection).
7

nếu bạn đang thực hiện việc này khi tải trang đảm bảo rằng bạn enclo se nó trong if(!IsPostBack){...}

+0

Vâng, tôi đã làm điều đó. Vẫn không làm việc. –

+0

@Night Shade. Làm rõ những gì bạn đang làm ở đây, bạn có nút "Gửi" trên trang hay bạn có AutoPostBack = true trên DDL của mình hay không. Và khi bạn nói "chỉ người đầu tiên được chọn", ý của bạn là gì - từ codebehind sau khi gửi biểu mẫu hoặc trên phía máy khách. Bởi vì như tôi đã nói trong nhận xét của tôi, HTML trong phần tử Xem Nguồn/kiểm tra sẽ KHÔNG được cập nhật khi bạn thực hiện lựa chọn vì đây là sự kiện phía máy khách (HTML không thể thấy điều này), chỉ khi bạn gửi biểu mẫu cho bạn xem giá trị đã chọn (hoặc với gỡ lỗi JS) – RPM1984

+0

@ RPM: Tôi nghĩ rằng nó phải đủ rõ ràng ngay bây giờ. –

4

Làm cách nào để userControl được thêm vào trang? Bạn có đang tự động sử dụng kỹ thuật LoadControl("...Send2DeliveryTeam.ascx"); không? Nếu vậy, hãy chắc chắn rằng bạn gọi LoadControl trong trang aspx Page_Init handler của bạn. Bất kỳ sau này và ViewState sẽ không được áp dụng cho ddl trong điều khiển và lựa chọn sẽ bị mất.

Ngoài ra, lưu ý rằng nếu bạn đặt Hiển thị = false trên điều khiển, nó sẽ không được hiển thị chút nào. Trong trường hợp bạn đang làm điều này?

+0

Điều khiển người dùng đã có trong trang đó. Tôi chỉ làm cho nó có thể nhìn thấy/vô hình. –

+0

Đâu là logic của bạn để làm cho nó có thể nhìn thấy/vô hình? trên .aspx hoặc .ascx? Trong trường hợp nào bạn thay đổi khả năng hiển thị? – TheGeekYouNeed

2

Thay vì sử dụng SelectedItem hãy thử sử dụng SelectedText. Tôi đã gặp phải vấn đề tương tự trong một ứng dụng C# win-forms và mặc dù bạn sẽ nghĩ (ít nhất là tôi đã làm) rằng SelectedText sẽ thêm văn bản vào trình đơn thả xuống nó thực sự chọn mục đó với văn bản đó.

Hy vọng điều này sẽ hữu ích.

+0

Vui, nhưng đọc câu trả lời của bạn đã bật một bóng đèn cho tôi. Ở đây chúng tôi 7 năm sau và tôi vẫn cần vb.net. Tôi đã cố gắng để thiết lập .SelectedIndex = 8 bởi vì danh sách thả xuống ngay trên đã cho phép tôi làm điều này. Vâng, SelectedIndex là một vị trí, không phải là một giá trị. Vì vậy, tôi đã thay đổi mã để thiết lập .SelectedValue = 8 và nó hoạt động. Ddl tốt của tôi đã có chỉ số 0-8, nhưng vấn đề của tôi chỉ có chỉ số 0-7. cảm ơn – JustJohn

Các vấn đề liên quan