A execução de Javascript depois de controlo seleccionada valor tiver sido definido
-
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 é:
- O usuário seleciona algo no primeiro drop-down.Segundo drop-down será ativado através de JavaScript.
- 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).
- 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?
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.