2008-08-13 12 views
7

Prosta aplikacja ASP.NET.Uruchamianie JavaScript po wybraniu wartości kontrolnej zostało ustawione

Mam dwie kontrolki rozwijane. W pierwszym drop-down mam zdarzenie JavaScript onChange. JavaScript włącza drugie menu rozwijane i usuwa z niego wartość (wartość wybraną w pierwszym menu rozwijanym). Jeśli klikną pustą pierwszą wartość rozwijanego menu, drugie menu zostanie wyłączone (a opcje zresetowane).

Mam również kod w metodzie OnPreRender, który włącza lub wyłącza drugi menu rozwijany na podstawie wartości pierwszego menu rozwijanego. Jest tak, że wartość pierwszej listy rozwijanej można wybrać w kodzie (ładowanie ustawień użytkownika).

Mój problem jest:

  1. Użytkownik wybiera coś w pierwszej listy rozwijanej. Druga lista rozwijana zostanie włączona za pomocą JavaScript.
  2. Następnie zmieniają trzecią listę rozwijaną, która inicjuje wysłanie z powrotem. Po powrocie listy rozwijane są w poprawnym stanie (wybrana pierwsza wartość, włączone drugie menu rozwijane).
  3. Jeśli następnie klikną przycisk Wstecz, drugie menu rozwijane nie będzie już włączone, chociaż powinno być, ponieważ coś jest zaznaczone w pierwszym menu rozwijanym.

Próbowałem dodanie skryptu startowego (która będzie ustawić prawidłowy stan drugiej rozwijanej przez ClientScript.RegisterStartupScript), jednak gdy ten zostanie wywołany pierwszym rozwijanej ma selectedIndex z 0, a nie to, co faktycznie jest. Domyślam się, że wartość selekcji jest ustawiana po moim skrypcie startowym (ale nadal nie nazywa się skryptem onChange).

Wszelkie pomysły na temat tego, co należy wypróbować?

Odpowiedz

2
<%@ 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> 

Edytuj: Zastąpił cały kod. To powinno działać nawet w twojej kontroli użytkownika. Wierzę, że Register.ClientScriptBlock nie działa, ponieważ kod, który wpisujesz w tym bloku, jest wykonywany przed wywołaniem window.onload. I zakładam (nie jestem tego pewien), że obiekty DOM nie mają ustawionych w tym czasie wartości. I właśnie dlatego otrzymujesz selectedIndex jak zawsze 0.

3

Jeśli drugie menu rozwijane jest początkowo włączone przez javascript (zakładam, że jest to podczas zmiany javascript, ponieważ nie określono), kliknięcie przycisku wstecz w celu ponownego wczytania poprzedniego odświeżenia nigdy go nie włącza.

Mieszanie programu ASP.NET z klasycznym javascript może być włochate. Możesz chcieć rzucić okiem na implementację Ajax ASP.NET (lub kontrolkę AjaxPanel innej firmy, jeśli musisz używać starszej wersji ASP.NET). Zapewnią ci zachowanie, które chcesz osiągnąć poprzez czysty C#, bez zmuszania cię do uciekania się do hackery-pokery javascript.

Powiązane problemy