2012-01-25 17 views
5

ResumenASP.NET WebForms DropDownList enlace de datos comportamiento extraño?

I cargar ciudades desde el contexto de datos en dos listas diferentes y se unen a sus respectivos controles DropDownList.

Aunque el código es el mismo para ambos, y solo los datos y obviamente el nombre de los controles son diferentes, el enlace de datos parece no funcionar correctamente para solo uno de ellos. ¡En lugar de mostrar el nombre de la ciudad, muestra su Id, es decir, solo para la primera opción!

de código subyacente

Tenemos dos controles DropDownList:

  1. DestinationDropDownList;
  2. OriginDropDownList.

Luego, las puebla.

public partial class MyControl : UserControl { 
    protected void Page_Load(object sender, EventArgs e) { 
     if (!IsPostBack) { 
      var instruction = new City() { 
       CityId = Guid.Empty, 
       CityName = "- Select a city -" 
      }; 

      var destinations = context.Cities.ToList(); 
      destinations = destinations.OrderBy(c => c.CityName).ToList(); 
      destinations.Insert(0, instruction); 
      DestinationDropDownList.DataSource = destinations; 
      DestinationDropDownList.DataTextField = "CityName"; 
      DestinationDropDownList.DataValueField = "CityId"; 
      DestinationDropDownList.DataBind(); 

      var origins = context.Cities.ToList(); 
      origins = origins.OrderBy(c => c.CityName).ToList(); 
      origins.Insert(0, instruction); 
      OriginDropDownList.DataSource = origins; 
      OriginDropDownList.DataTextField = "CityName"; 
      OriginDropDownList.DataValueField = "CityId"; 
      OriginDropDownList.DataBind(); 
     } 
    } 
    private static readonly MyDataContext context = new MyDataContext(); 
} 

HTML

<asp:DropDownList ID="DestinationDropDownList" runat="server" /> 
<asp:DropDownList ID="OriginDropDownList" runat="server" /> 

Datum muestra

*DestinationDropwDownList* 
    - 0000-0000-0000-0000-0000 (empty Guid) 
    - CityName 01 
    - CityName 02 
    - ... 

*OriginDropDownList* 
    - - Select a city - 
    - CityName 01 
    - CityName 02 
    - ... 

La visualización correcta es la representada por el control OriginDropDownList. ¿Por qué DestinationDropDownList no muestra los datos correctamente, es decir, para el primer y único primer elemento en su lista? ¡No lo entiendo en absoluto y perdí unas pocas horas tratando de encontrar la solución! = (

  1. I intentado quitar el primer elemento antes de insertar la instrucción;
  2. traté de insertar la instrucción dos veces, a continuación, quitar la primera;
  3. Intenté ir junto con el método DropDownList.Items.Add(string), y esto mostraba nada en cuanto a la primera fila, en lugar del Guid vacía.

Preguntas

  1. ¿Alguna vez ha encontrado estos problemas con el control DropDownList?
  2. ¿Cómo corregir este comportamiento?

editar # 1

michielvoo 's respuesta me ayudó a encontrar una nueva forma de unión a la instrucción de datos. A través de su código, la solución encontrada es la siguiente:

<asp:DropDownList ID="DestinationDropDownList" runat="server" 
        AppendDataBoundItems="true" 
        CssClass="required"> 
    <asp:ListItem Value="- Select a city -" /> 
</asp:DropDownList> 

retirar el inserto de instrucciones desde dentro del código por esta única DropDownList. Ahora muestra exactamente lo que quería desde el principio.

Acepté su respuesta ya que fue él quien me condujo a una buena solución. No creo que sea la solución real, pero siempre y cuando los resultados sean los suyos, no me importa demasiado. Además, en lugar de verificar Guid.Empty para la validación de la página, tendré que verificar mis instrucciones e invalidar la página cuando el usuario no seleccione una ciudad ubicada en otro índice que no sea 0, desde mi chequeo con Guid fallará.

editar # 2

Con el código subyacente se indica en la respuesta de michielvoo, que resuelve totalmente el problema que tuve para la DropDownList visualizar la propiedad ListItem.Value lugar de la propiedad ListITem.Text por sólo y sólo el primer elemento en la lista. No sé qué pasa con las otras formas, ¡pero esta funciona muy bien!

Gracias michielvoo!

Gracias a todos por su amable apoyo! =)

+0

Im no se puede reproducir este problema ... – JonH

+0

JonH: Estoy un poco contento de que no se puede, porque es un dolor cuando sucede! ;) ¡Gracias por tu granito de sal! =) –

+0

No entiendo por qué te está pasando esto ... – JonH

Respuesta

7

No he encontrado este problema antes, pero intentaré responder a su segunda pregunta. Veo poco valor al agregar el primer elemento 'instructivo' a través del código (corríjanme si estoy equivocado). Prefiero añadirán directamente en el margen de beneficio:

<asp:DropDownList ID="DestinationDropwDownList" runat="server" 
    AppendDataBoundItems="true" 
    DataTextField="CityName" 
    DataTextField="CityId"> 
    <asp:ListItem Text="- Select a city -" /> 
</asp:DropDownList> 

El primer elemento de unión sobrevivirá los debido al uso del atributo AppendDataBoundItems datos. También agregué los atributos DataTextField y DataValueField, también puedes eliminarlos del código.

Otra cosa que puedes hacer antes de los datos de unión, está proyectando las entidades a ListItem casos:

DestinationDropDownList.DataSource = 
    from d in destinations 
    select new ListItem() { 
    Text = d.CityName, 
    Value = d.CityId.ToString() 
    }; 
DestinationDropDownList.DataBind(); 

De esta manera, usted no tiene que fijar los DataTextField o DataValueField propiedades en el control a medida que ya está creando los artículos de la lista usted mismo.

+0

¡No sabía sobre eso! Déjame probarlo y ver qué pasa. =) Gracias! –

+0

+1 por enseñarme de una manera que no sabía. - Agregar el primer 'ListItem' como lo hace funciona bien, ya que puedo ver el elemento incluso después de que se produce el enlace de datos. Sin embargo, solo para el primer artículo, se muestra su valor, así que seguiré viendo el valor 'Guid.Empty'. Parece que solo hace esto con el primer elemento de la lista, ya que puedo ver mis instrucciones a partir de la que inserté en el código. –

+0

En cuanto a mi punto para hacerlo a través del código, es solo porque esta era la manera de hacerlo en Windows Forms. Soy bastante principiante en el desarrollo web, por lo que todavía no conozco realmente estas etiquetas y atributos HTML y ASP.NET. Prefiero ver el código C#, tengo la impresión de que me permite un mejor control sobre los controles y lo que sucede en la página en general. =) –