¿Cuál es la mejor manera de codificar una lista desplegable de Mes y Año para ASP.NET?

StackOverflow https://stackoverflow.com/questions/812330

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo una aplicación interna que necesito para tener una lista desplegable para dos elementos de tipo de fecha: Mes y Año . Estos valores no se encuentran en una base de datos u otro repositorio de información.

Sé que solo puedo configurar una lista con los valores que necesito agregándolos a un objeto similar al diccionario (necesito relacionar el Mes con 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 solo puedo elegir un año de inicio e iterar hasta el +1 año actual o actual 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?

¿Fue útil?

Solución

Puede usar esto para obtener una lista de todos los nombres de los Meses y recorrerla.

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

Puede usarlo así ... utilizando el índice del mes como el valor de su menú desplegable

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

Otros consejos

Extendiendo la respuesta de @Jesse Brown ...

Con una directiva utilizando 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 02 de febrero 03 de marzo ... 12 de diciembre

Otro refinamiento podría ser hacer que el mes mostrado sea el mes actual agregando:

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

Después del bucle for.

Aquí está mi solución, que es muy similar a la solución de @jesse-brown (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 es lo que está usando esta aplicación web (legado). Sin embargo, muchas gracias por los ejemplos en C # (mi idioma preferido), estoy publicando VB.NET aquí para ayudar a la comunidad VB.NET también.

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

Nota Prefiero usar un codebehind para las cosas de esta forma: sigue siendo parte de la vista y no hay nada de malo en que la vista cree una Lista de selección.

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)
                });
            }
        }
    }

El código de abajo es para el menú desplegable del mes de carga 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()));
        }
    }
 public void bind_month()
    {
        var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;

        ddl_month.Items.Insert(0, new ListItem("--Select--", "0"));

        for (int i = 0; i < months.Length-1; i++)
        {
            ddl_month.Items.Add(new ListItem(months[i],(i+1).ToString()));
        }

    }

/ Intente este código para enlazar todo el mes en la lista desplegable sin usar la base de datos /

 public void GetMonthList(DropDownList ddl)
    {
        DateTime month = Convert.ToDateTime("1/1/2000");
        for (int i = 0; i < 12; i++)
        {
            DateTime NextMont = month.AddMonths(i);
            ListItem list = new ListItem();
            list.Text = NextMont.ToString("MMMM");
            list.Value = NextMont.Month.ToString();
            ddl.Items.Add(list);
        }
        //ddl.Items.Insert(0, "Select Month");
        ddl.Items.FindByValue(DateTime.Now.Month.ToString()).Selected = true;
    }

Puedes probar esto ...  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()))};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top