2010-09-28 18 views
5

ja wypełniania kontrolki DropDownList następująco -ASP.NET DropDownList Problem: SelectedItem nie zmienia

public partial class UserControls_PMS_Send2DeliveryTeam : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
      // SA 100928 Get the delivery teams and their respective email addresses 
      string[] delTeam = ConfigurationManager 
           .AppSettings["deliveryTeamNames"] 
           .Split(','); 
      string[] delTeamEmails = ConfigurationManager 
            .AppSettings["deliveryTeamEmails"] 
            .Split('|'); 

      if (delTeam.Length != delTeamEmails.Length) 
      { 
       showAlert("You have an error in the configuration of the delivery teams"); 
       return; 
      } 

      for(int looper=0; looper<delTeam.Length; looper++) 
       delTeamDDList 
       .Items 
       .Add 
       ( 
        new ListItem(delTeam[looper], delTeamEmails[looper]) 
       ); 

     } 

    // Other methods 
} 

Ale gdy użytkownik wybierze wartość z tej listy rozwijanej, tylko pierwszy element jest zaznaczony. Aby wyjaśnić więcej, załóżmy, że lista zawiera 4 pozycje: item 1, item 2, item 3 i item 4. Gdy użytkownik wybierze czwartą pozycję z listy, wybierze item 1 jako wybraną wartość.

Jaki jest tego powód?

EDIT

Właśnie sprawdziłem wygenerowany kod HTML na DropDownList przy użyciu Firebug, a wydaje się, że „wybrany” wartość nie w ogóle, nawet jeśli mam wybrać różne wartości z DropDownList zmienić.

Wygenerowany HTML jest następujący -

<select class="select" id="Send2DeliveryTeam_delTeamDDList" name="Send2DeliveryTeam$delTeamDDList"> 
    <option value="value1" selected="selected">Project Initiation Team</option> 
    <option value="value2">Service Delivery Centre</option> 
    <option value="value3">TCS</option> 
    <option value="value4">PIT &amp; SDC</option> 
    <option value="value5">SDC &amp; TCS</option> 
    <option value="value6">PIT &amp; TCS</option> 
    <option value="value7">PIT &amp; SDC &amp; TCS</option> 
</select> 

Po pierwsze, użytkownik wybiera wartość z listy rozwijanej. Następnie naciska przycisk, który uruchamia kliknięcie. Odpowiednią funkcją obsługi zdarzeń przycisku jest miejsce, w którym uzyskuję dostęp do wybranej wartości listy rozwijanej. Kod jest następujący -

// Button event-handler code 
protected void assignDelTeamButton_Click(object sender, EventArgs e) 
{ 
    // This is where I am always getting the same value, no matther what I choose 
    // from the dropdown list, and this value is the one which is selected by default 
    // when the page loads. I mean, the "SelectedIndex" is always 0. 
    string selected_value = delTeamDDList.SelectedItem.ToString(); 

    // Other codes 
} 

Plik ascx -

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Send2DeliveryTeam.ascx.cs" Inherits="UserControls_PMS_Send2DeliveryTeam" %> 
<div id="Common"> 
    <h3>Welcome <%string user = HttpContext.Current.Session["user_name"].ToString();%><%=user %></h3> 
    <h1>Request Estimate Screen</h1> 
    <span>Request Estimate and Assign a Delivery team to a Request</span><br /> 
    <label>Enter an existing project number</label> 
    <asp:TextBox ID="reqNum" runat="server" CssClass="textBox" /><br /> 
    <label>Select Delivery Team</label> 
    <asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" > 

    </asp:DropDownList> 
    <label> - Sorted in alpha order</label><br /><br /> 
    <label>&nbsp;</label> 
    <asp:button ID="assignDelTeamButton" runat="server" Text="Continue" 
    CssClass="button" onclick="assignDelTeamButton_Click"/><br /> 
</div> 

Druga Edycja

Gdybym ciężko Kodeksu ListItems następująco, to działa doskonale -

<asp:DropDownList ID="delTeamDDList" runat="server" CssClass="select" > 
    <asp:ListItem Text="Project Initiation Team" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="Service Delivery Centre" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="SDC & TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & TCS" Value="[email protected]"></asp:ListItem> 
    <asp:ListItem Text="PIT & SDC & TCS" Value="[email protected]"></asp:ListItem> 
</asp:DropDownList> 
+0

jak wygląda renderowany HTML? jaka jest para klucz/wartość, która jest renderowana? biorąc to pod uwagę - należy zachować ostrożność podczas tworzenia pętli w oparciu o jedną kolekcję i dodawać klucz/wartość w oparciu o tę kolekcję i inną. – RPM1984

+0

@RPM: Zobacz edycję. –

+0

@Night Shade - czy możesz podać surowy HTML? Chcę zobaczyć, jak wygląda prawdziwy HTML, zanim przejdziesz do "wybranego elementu". sprawdźmy, czy jest to prawidłowy html. im bankowość na nie. – RPM1984

Odpowiedz

8

Wykonaj jedną z następujących czynności:

  1. Włącz ViewState w pliku web.config lub zawierające stronę, jeśli to się tam.
  2. Co więcej, upewnij się, że funkcja ViewState jest nadal włączona, ale zapełnij DDL w module Init sterowania użytkownika (ale nie owijaj go! IsPostBack). To będzie mieć logikę dostępu do danych na każdej stronie/init kontrolnej, nawet przy odświeżeniu, ale nie doda niepotrzebnych danych do ViewState, ponieważ nie zainicjujesz biblioteki DLL, a następnie ViewState śledzi zmiany wprowadzone w jego danych źródło. Jednak nadal chcesz ViewState, ponieważ DDL w ASP.NET wymagają ViewState w celu śledzenia wybranego indeksu/wartości na odświeżenie (jeśli całkowicie wyłączyć ViewState można uzyskać tylko DDLs wysłany z powrotem wybraną wartość, znajdując go w FORMULARZU ZAPISANEGO wniosku NameValueCollection).
7

jeśli robisz to podczas ładowania strony, upewnij się, że włączyłeś se to w if(!IsPostBack){...}

+0

Tak, zrobiłem to. Wciąż nie działa. –

+0

@Night Shade. Wyjaśnij, co tutaj robisz, czy masz przycisk "Prześlij" na stronie, czy też masz Autopostback = true w swoim DDL. A kiedy mówisz "tylko pierwszy jest wybrany", co masz na myśli - od kodu po przesłaniu formularza lub po stronie klienta. Ponieważ, jak powiedziałem w moim komentarzu, element HTML w widoku źródło/inspekcja NIE zostanie zaktualizowany po dokonaniu wyboru, ponieważ jest to zdarzenie po stronie klienta (HTML tego nie widzi), tylko po przesłaniu formularza zobacz wybraną wartość (lub z debugowaniem JS) – RPM1984

+0

@ RPM: Myślę, że teraz powinno być wystarczająco jasne. –

4

Jak jest dodawana kontrolka userControl do strony? Robisz to dynamicznie, używając techniki LoadControl("...Send2DeliveryTeam.ascx");? Jeśli tak, upewnij się, że wywołujesz LoadControl w twojej stronie aspx Page_Init handler. Dowolny później i obiekt ViewState nie zostanie zastosowany do ddl w kontrolerze, a wybór zostanie utracony.

Pamiętaj też, że jeśli ustawisz Visible = false na formancie, nie będzie on w ogóle renderowany. W którym przypadku to robisz?

+0

Kontrola użytkownika jest już na tej stronie. Po prostu robię to widocznym/niewidzialnym. –

+0

Gdzie jest twoja logika, aby uczynić ją widoczną/niewidzialną? na .aspx lub .ascx? W jakim przypadku zmieniasz widoczność? – TheGeekYouNeed

2

Zamiast używać SelectedItem spróbuj użyć SelectedText. Znalazłem ten sam problem w aplikacji wygrywającej C# i chociaż pomyślisz (przynajmniej ja), że SelectedText doda tekst do listy rozwijanej, to faktycznie wybierze przedmiot z tym tekstem.

Mam nadzieję, że to pomoże.

+0

Zabawne, ale przeczytanie odpowiedzi obróciło się dla mnie żarówką. Tutaj jesteśmy 7 lat później i nadal potrzebuję vb.net. Próbowałem ustawić. SelectedIndex = 8, ponieważ lista rozwijana znajdująca się powyżej pozwoliła mi to zrobić. Cóż, SelectedIndex to pozycja, a nie wartość. Więc zmieniłem kod, aby ustawić. SelectedValue = 8 i to działa. Mój dobry ddl miał indeksy 0-8, ale mój problem miał tylko indeksy 0-7. dzięki – JustJohn

Powiązane problemy