Sự kiện được lựa chọn của DropDownList không được kích hoạt


196

Tôi có một đối tượng DropDownList trong trang web của mình. Khi tôi nhấp vào nó và chọn một giá trị khác, không có gì xảy ra, mặc dù tôi có một chức năng được nối với SelectedIndexChangedsự kiện.

Đầu tiên, mã HTML của đối tượng thực tế:

<asp:DropDownList ID="logList" runat="server" 
       onselectedindexchanged="itemSelected">
</asp:DropDownList>

Và đây là chức năng đó , itemSelected:

protected void itemSelected(object sender, EventArgs e)
{
    Response.Write("Getting clicked; " + sender.GetType().ToString());
    FileInfo selectedfile;
    Response.Write("<script>alert('Hello')</script>");
    foreach (FileInfo file in logs)
    {
        if (file.Name == logList.Items[logList.SelectedIndex].Text)
        {
            Response.Write("<script>alert('Hello')</script>");
        }
    }
}

Không có Phản hồi nào xuất hiện và phần JavaScript đó không bao giờ chạy. Tôi đã thử điều này trên phiên bản 3.6 mới nhất của Firefox, cũng như Internet Explorer 8. Phiên bản này đang được phục vụ từ máy Windows Server 2003 R2, chạy ASP.NET với phiên bản .NET Framework 4.

Câu trả lời:


399

Đặt thuộc tính DropDownList AutoPostBackthành true.

Ví dụ:

<asp:DropDownList ID="logList" runat="server" AutoPostBack="True" 
        onselectedindexchanged="itemSelected">
    </asp:DropDownList>

3
Vâng, điều đó dường như đã sửa nó, cảm ơn bạn. Bạn có thể giải thích lý do tại sao?
TGP1994

2
@ TGP1994: Thuộc tính AutoPostBack được sử dụng để đặt hoặc trả về việc có hay không một bài đăng tự động xảy ra
Vyas Dev

2
Khi đang chọn danh sách thả xuống, nó sẽ trở thành giá trị đầu tiên của danh sách
Muhamed Shafeeq

20
@MuhamedShafeeq - Nếu bạn điền danh sách vào phương thức Page_Load, hãy đảm bảo bạn bọc mã trong if (! IsPostback). Điều này sẽ ngăn nó tải lại danh sách và đặt nó trở lại mục đầu tiên.
DaveK


44

Tôi biết bài viết cũ hơn một chút của nó, nhưng tôi vẫn muốn thêm một cái gì đó vào câu trả lời ở trên.

Có thể có một số tình huống trong đó, " giá trị " của nhiều mục trong danh sách thả xuống được nhân đôi / giống nhau. Vì vậy, hãy đảm bảo rằng bạn không có giá trị lặp lại trong các mục danh sách để kích hoạt sự kiện " onselectedindexchanged " này


Hai trong số các giá trị của tôi đã được nhân đôi và điều đó khiến nó không kích hoạt sự kiện được chọn thay thế ngay cả khi hậu kỳ đang diễn ra. Cảm ơn vì điều đó!
Mike

giá trị được chọn của danh sách thả xuống có giá trị trong nhiều mục. vui lòng kiểm tra truy vấn rằng giá trị không phải là null.
dinesh kumar

12

Thêm bất động sản ViewStateMode="Enabled"EnableViewState="true"AutoPostBack="true"trong thả DropDownList


các thuộc tính ViewState là không cần thiết và AutoPostBack đã được đề xuất trong nhiều câu trả lời trước đó.
TylerH

4

Cũng đảm bảo rằng trang là hợp lệ. Bạn có thể kiểm tra điều này trong các công cụ phát triển trình duyệt (F12)

Trong tab Bảng điều khiển, chọn Mục tiêu / Khung chính xác và kiểm tra thuộc tính [Page_IsValid]

Nếu trang không hợp lệ, biểu mẫu sẽ không gửi và do đó không kích hoạt sự kiện.


1
Lên bình chọn cho HerbalMart. Trong trường hợp của tôi, trang không hợp lệ nhưng vì tôi sử dụng Telerik RadAjaxManager trên các trang của mình nên lỗi không hiển thị khi tôi kiểm tra trong trình duyệt của mình. Khi tôi nhận xét toàn bộ RadAjaxManager, lỗi đã xuất hiện và tôi đã có thể sửa nó.
dùng2721607

Điều đó có thể hữu ích cho những người gặp vấn đề đó, nhưng điều đó giống như nói với những người mà xe của họ sẽ không khởi động khi họ bật chìa khóa "đảm bảo đèn pha của bạn hoạt động hoặc bạn sẽ không thể nhìn thấy khi lái xe vào ban đêm". Nói cách khác, điều này không trả lời câu hỏi đang được hỏi.
TylerH

3

Đối với tôi câu trả lời là thuộc tính trang aspx, tôi đã thêm Async = "true" vào thuộc tính trang và điều này đã giải quyết vấn đề của tôi.

<%@ Page Language="C#" MasterPageFile="~/MasterPage/Reports.Master"..... 
    AutoEventWireup="true" Async="true" %>

Đây là cấu trúc của bảng cập nhật của tôi

<div>
  <asp:UpdatePanel ID="updt" runat="server">
    <ContentTemplate>

      <asp:DropDownList ID="id" runat="server" AutoPostBack="true"        onselectedindexchanged="your server side function" />

   </ContentTemplate>
  </asp:UpdatePanel>
</div>

1

Thay vì những gì bạn đã viết, bạn có thể viết nó trực tiếp trong sự kiện được chọn IndexChanged của điều khiển danh sách thả xuống, ví dụ:

protected void ddlleavetype_SelectedIndexChanged(object sender, EventArgs e)
{
 //code goes here
}

1
Chỉ khi cài đặt AutoEventWireup trên trang aspx là đúng, nếu không, bạn cần thực hiện thủ công, theo ví dụ ban đầu.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.