2010-09-28 27 views
5

estoy poblando un control DropDownList de la siguiente manera -ASP.NET DropDownList problema: SelectedItem no está cambiando

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 
} 

Pero cada vez que el usuario selecciona un valor de este menú desplegable, se está seleccionando sólo el primer elemento. Para aclarar más, suponga que la lista tiene 4 elementos, item 1, item 2, item 3 y item 4. Cuando el usuario selecciona el 4º elemento de las listas, selecciona item 1 como el valor seleccionado.

¿Cuál es la razón detrás de esto?

EDITAR

he acaba de comprobar el código HTML generado para el DropDownList utilizando Firebug, y parece que el valor "seleccionado" no cambia en absoluto, incluso si decido valores diferentes de la DropDownList.

El HTML generado es el siguiente -

<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> 

En primer lugar, el usuario selecciona un valor de la lista desplegable. Luego presiona un botón, que dispara el evento click. La función del controlador de eventos correspondiente al botón es el lugar donde estoy accediendo al valor seleccionado de la lista desplegable. El código es el siguiente -

// 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 
} 

la 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> 

Segunda Edición

Si I código el ListItems de la siguiente manera, funciona perfectamente -

<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

¿cómo se ve el HTML procesado? ¿Cuál es el par clave/valor que se procesa? Dicho esto: tenga cuidado al realizar un bucle basado en una colección, y agregue una clave/valor basado en esa colección Y otra. – RPM1984

+0

@RPM: Consulte la edición. –

+0

@Night Shade: ¿puede proporcionar el HTML sin formato? Quiero ver cómo se ve el HTML real antes de ingresar al "elemento seleccionado". veamos si es válido html. estoy bancario en no. – RPM1984

Respuesta

8

Realice una de las siguientes opciones:

  1. Encienda ViewState en Web.config o que contiene la página si es fuera de allí.
  2. Mejor aún, asegúrese de que ViewState todavía esté habilitado, pero llene su DDL en el Init de su Control de usuario (pero no lo envuelva con! IsPostBack). Esto tendrá su lógica de acceso a datos en cada inicio de página/control, incluso en la devolución de datos, pero no agregará datos innecesarios a ViewState ya que no está iniciando su DLL, y luego ViewState hará un seguimiento de los cambios que realice en sus datos fuente. Sin embargo, aún desea ViewState porque los DDL en ASP.NET requieren ViewState para rastrear el índice/valor seleccionado en la devolución de datos (si apaga completamente ViewState, solo puede obtener los DDL publicados con el valor seleccionado al encontrarlo en el FORMULARIO de Solicitud publicado NameValueCollection).
7

Si está haciendo esto en la carga de la página, asegúrese de que encierra se it en if(!IsPostBack){...}

+0

Sí, he hecho eso. Sigue sin funcionar. –

+0

@Night Shade. Aclare lo que está haciendo aquí, ¿tiene un botón "Enviar" en la página, o tiene AutoPostBack = verdadero en su DDL? Y cuando dice "solo se selecciona el primero", ¿a qué se refiere? Desde el código subyacente después de enviar el formulario o desde el lado del cliente. Porque como dije en mi comentario, el HTML en el elemento Ver fuente/inspección NO se actualizará cuando realice una selección, ya que este es un evento del lado del cliente (el HTML no puede ver esto), solo cuando envíe el formulario, ¿lo hará? ver el valor seleccionado (o con la depuración de JS) – RPM1984

+0

@RPM: Creo que debería ser lo suficientemente claro ahora. –

4

¿Cómo se agrega el userControl a la página? ¿Lo estás haciendo dinámicamente usando la técnica LoadControl("...Send2DeliveryTeam.ascx");? Si es así, asegúrese de llamar a LoadControl en el controlador Page_Init de la página aspx. Cualquier posterior y el ViewState no se aplicará al ddl en el control y la selección se perderá.

Además, tenga en cuenta que si establece Visible = false en el control, no se representará en absoluto. ¿En qué evento estás haciendo esto?

+0

El control de usuario ya está en esa página. Solo lo estoy haciendo visible/invisible. –

+0

¿Dónde está su lógica para hacerlo visible/invisible? en el .aspx o .ascx? ¿En qué evento cambias la visibilidad? – TheGeekYouNeed

2

intente utilizar intente con SelectedText. He encontrado el mismo problema en una aplicación C-win-forms y, aunque uno pensaría (al menos así lo hice) que SelectedText agregaría texto al menú desplegable, en realidad selecciona el elemento con ese texto.

Espero que esto ayude.

+0

Gracioso, pero al leer tu respuesta encendiste una bombilla para mí. Aquí estamos 7 años después y todavía necesito vb.net. Estaba tratando de establecer .SelectedIndex = 8 porque la lista desplegable de arriba me dejaba hacer esto. Bueno, SelectedIndex es una posición, no un valor. Así que cambié el código para establecer .SelectedValue = 8 y funciona. Mi buen ddl tenía índices de 0-8, pero mi problema uno solo tenía índices de 0-7. Gracias – JustJohn

Cuestiones relacionadas