2009-05-01 11 views
10

Tengo una aplicación interna que necesito tener una lista desplegable para dos elementos de tipo de fecha: Mes y Año. Estos valores no están en una base de datos u otro repositorio de información.¿Cuál es la mejor manera de codificar una lista desplegable de mes y año para ASP.NET?

Sé que podría acaba de configurar una lista con los valores que necesito mediante su inclusión en un diccionario como objetivo (I necesita para correlacionar el Mes de la representación numérica, Enero => 01):

var months = new Dictionary<String,String>(); 
months.Add("01", "January"); 
... 

La lista desplegable para el año será un poco más fácil ya que puedo elegir un año inicial e iterar hasta el actual o actual + 1 año en una lista genérica.

¿Hay una mejor manera de manejar estos elementos de datos? ¿Algo incorporado, o un buen patrón de diseño que debería implementar?

+0

Interesante pregunta, he tenido la misma pregunta una vez. +1 – pyrocumulus

+0

¿Necesita localizar este valor? – Greg

+0

La localización no es un requisito; sin embargo, si ya existe en un estado localizado, no estaría mal. –

Respuesta

23

Puede usar esto para obtener una lista de todos los nombres de Mes y recorrerlo.

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames 

Usted puede utilizar de esta manera ... usando el índice del mes como el valor para su desplegable

var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames; 
for (int i = 0; i < months.Length; i++) 
{ 
    ddl.Items.Add(new ListItem(months[i], i.ToString())); 
} 
+0

¿Hay alguna forma de corroborar el nombre de un mes con la representación numérica (es decir, enero => 1)? –

+0

verifique la edición, agregué su uso. – Jab

+0

La matriz devuelta por CultureInfo.InvariantCulture.DateTimeFormat.MonthNames contiene contiene "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" y "" en orden. Puede usar un ciclo for para obtener el índice para cada valor. – Greg

4

La extensión de la respuesta de @Jesse Brown ...

Con un utilizando la directiva System.Globalization, tengo el siguiente código:

for (int x = 0; x < 12; x++) 
{ 
    cboMonth.Items.Add 
    (
     (x+1).ToString("00") 
     + " " 
     + CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(x) 
    ); 
} 

Esto produce una lista desplegable que se parece a:

01 de enero de 02 de febrero de 03 de marzo de ... 12 de diciembre de

Un refinamiento adicional podría ser la de hacer el mes que se muestra el mes actual, añadiendo:

cboMonth.Text = DateTime.Now.Month.ToString("00") 
    + " " 
    + CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(DateTime.Now.Month); 

Después del bucle for.

2

Aquí está mi solución, que es muy similar a la solución de @ Jesse-marrón (la respuesta aceptada)

VB.NET:

En una clase de funciones globales:

Public Shared Function GetMonthList() As Generic.Dictionary(Of String, String) 
    Dim months As New Generic.Dictionary(Of String, String)() 
    For m As Int32 = 1 To 12 
     months.Add(String.Format("{0:0#}", m), CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(m)) 
    Next 

    Return months 
End Function 

En la página ASPX:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    ddMonth.DataSource = GlobalFunctions.GetMonthList() 
    ddMonth.DataValueField = "Key" 
    ddMonth.DataTextField = "Value" 
    ddMonth.DataBind() 

End Sub 

Esta implementación está en VB.NET porque eso sucede para ser lo que esta aplicación web está usando (herencia), sin embargo, muchas gracias por los ejemplos en C# (mi idioma preferido), estoy publicando el VB.NET aquí para ayudar a la comunidad VB.NET también.

2

Para ASP.NET MVC esto es lo que estoy haciendo.

Nota I prefer to use a codebehind para cosas como esta: sigue siendo parte de la vista y no hay nada de malo en la vista de la construcción de una lista selectiva.

PaymentControl.ascx

<%= Html.DropDownList("ExpirationMonth", ExpirationMonthDropdown)%>/
<%= Html.DropDownList("ExpirationYear", ExpirationYearDropdown)%> 

PaymentControl.ascx.cs

public partial class PaymentControl : ViewUserControl<CheckoutModel> 
    { 
     public IEnumerable<SelectListItem> ExpirationMonthDropdown 
     { 
      get 
      { 
       return Enumerable.Range(1, 12).Select(x => 

        new SelectListItem() 
        { 
         Text = CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames[x - 1] + " (" + x + ")", 
         Value = x.ToString(), 
         Selected = (x == Model.ExpirationMonth) 
        }); 
      } 
     } 

     public IEnumerable<SelectListItem> ExpirationYearDropdown 
     { 
      get 
      { 
       return Enumerable.Range(DateTime.Today.Year, 20).Select(x => 

       new SelectListItem() 
       { 
        Text = x.ToString(), 
        Value = x.ToString(), 
        Selected = (x == Model.ExpirationYear) 
       }); 
      } 
     } 
    } 
+0

Una vez que utilizo este 'pública IEnumerable ExpirationMonthDropdown {' ​​dentro de mi clase del modelo que estoy recibiendo siguiente error 'El 'modelo' nombre no existe en el actual context' – kez

1

A continuación código es para la carga meses desplegable como Seleccionar

private void LoadMonth() 
    { 
     ddlmonth.Items.Add(new ListItem("Select", 0.ToString())); 
     var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames; 
     for (int i = 0; i < months.Length-1; i++) 
     { 
      ddlmonth.Items.Add(new ListItem(months[i], (i+1).ToString())); 
     } 
    } 
+0

Proporcione alguna explicación sobre su código. De esta forma tu respuesta será más útil. – mastov

-1

Puede probar este ... Ref aquí:

http://allinworld99.blogspot.com/2015/01/bind-monthsyear-dropdownlist-c-aspnet.html

for (int i = 1; i <= 12; i++) 
{ 
    drpBMonth.Items.Add(new System.Web.UI.WebControls.ListItem(DateTimeFormatInfo.CurrentInfo.GetMonthName(i), i.ToString()))}; 
+0

Hola, aquí se desaconsejan tanto las respuestas solo de enlace como las respuestas de solo código. ¿Puedes editar tu respuesta para explicar cómo esto resuelve el problema del PO? –

Cuestiones relacionadas