O evento SelectedIndexChanged do DropDownList não está sendo acionado

196

Eu tenho um objeto DropDownList na minha página da web. Quando clico nele e seleciono um valor diferente, nada acontece, mesmo que eu tenha uma função conectada ao SelectedIndexChangedevento.

Primeiro, o código HTML do objeto real:

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

E é essa função 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>");
        }
    }
}

Nenhuma das respostas aparece e essa parte do JavaScript nunca é executada. Eu tentei isso na versão 3.6 mais recente do Firefox e no Internet Explorer 8. Isso está sendo servido em uma máquina com Windows Server 2003 R2, executando o ASP.NET com o .NET Framework versão 4.

TGP1994
fonte

Respostas:

399

Defina a AutoPostBackpropriedade DropDownList como true.

Por exemplo:

<asp:DropDownList ID="logList" runat="server" AutoPostBack="True" 
        onselectedindexchanged="itemSelected">
    </asp:DropDownList>
Vyas Dev
fonte
3
Bem, isso parece ter resolvido, obrigado. Você pode explicar o porquê?
TGP1994
2
@ TGP1994: A propriedade AutoPostBack é usado para definir ou retornar ou não um posto de volta automática ocorre
Vyas Dev
2
Quando estou selecionando lista suspensa, a sua vai primeiro valor da lista
Muhamed Shafeeq
20
@MuhamedShafeeq - Se você estiver preenchendo a lista no método Page_Load, certifique-se de incluir o código em if (! IsPostback). Isso impedirá que ela recarregue a lista e a retorne ao primeiro item.
Davek
78

tente definir AutoPostBack="True"no DropDownList.

The Scrum Meister
fonte
44

Eu sei que é um pouco mais antigo, mas ainda assim gostaria de acrescentar algo às respostas acima.

Pode haver alguma situação em que, o " valor " de mais de um item na lista suspensa é duplicado / mesmo. Portanto, verifique se você não tem valores repetidos nos itens da lista para acionar esse evento " onselectedindexchanged "

4u.Ans
fonte
Dois dos meus valores foram duplicados e isso estava causando o não acionamento do evento onselected indexchanged, mesmo que a postagem estivesse acontecendo. Obrigado por isso!
Mike
o valor selecionado do menu suspenso estava tendo nulo em muitos itens. verifique na consulta se esse valor não é nulo.
dinesh kumar
12

Adicionar propriedade ViewStateMode="Enabled"e EnableViewState="true" E AutoPostBack="true"na queda DropDownList

Dilip Kr Singh
fonte
as propriedades do ViewState não são necessárias e o AutoPostBack foi sugerido em várias respostas anos antes desta.
TylerH 12/03
4

Verifique também se a página é válida. Você pode verificar isso nas ferramentas de desenvolvedor de navegadores (F12)

Na guia Console, selecione o Destino / Quadro correto e verifique a propriedade [Page_IsValid]

Se a página não for válida, o formulário não será enviado e, portanto, não acionará o evento.

HerbalMart
fonte
1
Voto para HerbalMart. No meu caso, a página era inválida, mas porque eu uso o Telerik RadAjaxManager em minhas páginas, o erro não era exibido quando eu testei no meu navegador. Quando comentei todo o RadAjaxManager, o erro se apresentou e eu pude corrigi-lo.
user2721607
Isso pode ser útil para pessoas que têm esse problema, mas é como dizer às pessoas cujo carro não liga quando apertam a tecla "certifique-se de que seus faróis funcionem ou você não poderá ver quando estiver dirigindo à noite". Em outras palavras, isso não responde à pergunta que está sendo feita.
TylerH 12/03
3

Para mim, a resposta foi atributo da página aspx, adicionei Async = "true" aos atributos da página e isso resolveu o meu problema.

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

Essa é a estrutura do meu painel de atualização

<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>
Justin F
fonte
1

Em vez do que você escreveu, você pode escrevê-lo diretamente no evento SelectedIndexChanged do controle da lista suspensa, por exemplo

protected void ddlleavetype_SelectedIndexChanged(object sender, EventArgs e)
{
 //code goes here
}
user2541273
fonte
1
Somente se a configuração AutoEventWireup na página aspx for verdadeira, caso contrário, você precisará fazer isso manualmente, conforme o exemplo original.