A execução de Javascript depois de controlo seleccionada valor tiver sido definido

StackOverflow https://stackoverflow.com/questions/9341

  •  08-06-2019
  •  | 
  •  

Pergunta

Simples ASP.NET aplicação.

Eu tenho dois controles de drop-down.No primeiro drop-down eu tenho um JavaScript onChange do evento.O JavaScript permite que o segundo drop-down, e remove um valor (o valor selecionado no primeiro drop-down).Se clicar em branco, o primeiro valor da lista drop-down e, em seguida, o segundo drop-down será desativado (e as opções de reset).

Eu também tenho o código no OnPreRender método que irá ativar ou desativar a segunda lista suspensa com base no valor da primeira lista drop-down.Isso é para que o valor do primeiro drop-down pode ser selecionada no código (carregar configurações do usuário).

O meu problema é:

  1. O usuário seleciona algo no primeiro drop-down.Segundo drop-down será ativado através de JavaScript.
  2. Eles, então, mudar um terceiro drop-down, que inicia uma postagem de volta.Após a postagem a lista drop-downs está no estado correto (primeiro valor selecionado, segundo drop-down ativada).
  3. Se eles, em seguida, clique no botão voltar, a segunda lista suspensa deixarão de ser habilitado, embora seja o que há algo selecionados na primeira lista drop-down.

Eu tentei adicionar um script de inicialização (que vai definir o estado correto da segunda-drop-down), através de ClientScript.RegisterStartupScript, no entanto , quando este é chamado o primeiro drop-down tem um selectedIndex de 0, não o que ele realmente é.Meu palpite é de que o valor da seleção fica definido após a minha partida de script (mas ainda não dá onChange script).

Alguma idéia sobre o que tentar?

Foi útil?

Solução

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void indexChanged(object sender, EventArgs e)
    {
        Label1.Text = " I did something! ";
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test Page</title>
</head>
<body>
    <script type="text/javascript">
        function firstChanged() {
            if(document.getElementById("firstSelect").selectedIndex != 0)
                document.getElementById("secondSelect").disabled = false;
            else
                document.getElementById("secondSelect").disabled = true;
        }
    </script>
    <form id="form1" runat="server">
    <div>
        <select id="firstSelect" onchange="firstChanged()">
            <option value="0"></option>
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <select id="secondSelect" disabled="disabled">
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server">
            <asp:ListItem Text="One" Value="1"></asp:ListItem>
            <asp:ListItem Text="Two" Value="2"></asp:ListItem>    
        </asp:DropDownList>
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
    <script type="text/javascript">
        window.onload = function() {firstChanged();}
    </script>
</body>
</html>

Editar:Substituiu o código inteiro.Isso deve funcionar mesmo no controlo de utilizador.Eu acredito que Registrar.ClientScriptBlock não está funcionando porque o código que você escrever no bloco é executado antes de janela.onload é chamado.E, creio eu (não tenho a certeza de que este ponto) que o DOM de objetos de não ter seus valores definidos no momento.E, é por isso que você está recebendo selectedIndex como sempre 0.

Outras dicas

Se o segundo suspensa inicialmente é ativado através de javascript (eu estou supondo que esta é durante um javascript onchange, desde que você não especificar) e, em seguida, clicando no botão voltar para recarregar a reposição anterior nunca vai permitir isso.

A mistura de ASP.NET com o clássico o javascript pode ser peludo.Você pode querer ter um olhar para ASP.NET's Ajax implementação (ou a de terceiros AjaxPanel de controle se você é forçado a usar uma antiga ASP.NET versão).Aqueles irá dar-lhe o comportamento que você quer através de pura C#, sem forçá-lo a recorrer ao javascript hackery-pokery.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top