Qual é a melhor forma de código-se uma queda Mês e Ano lista para baixo para ASP.NET?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo interno que precisa ter uma lista suspensa por dois elementos do tipo data: Mês e Ano . Estes valores não estão em um banco de dados ou outro repositório de informações.

Eu sei que eu poderia apenas configurar uma lista com os valores que eu preciso, adicionando-os a um dicionário como objeto (eu preciso correlacionar o mês para a representação numérica, janeiro => 01):

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

A queda de lista para o ano abaixo será um pouco mais fácil, pois eu só posso escolher um ano começando e reitere-se à corrente ou corrente + 1 ano em uma lista genérica.

Existe uma maneira melhor de lidar com esses elementos de dados? Algo embutido, ou um padrão de design bom que eu deveria estar implementação?

Foi útil?

Solução

Você pode usar isso para obter uma lista de todos os nomes de mês e percorrer-lo.

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

Você pode usá-lo como este ... usando o índice do mês como o valor para o seu suspensa

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

Outras dicas

Estendendo resposta de @Jesse Brown ...

Com um usando System.Globalization directiva, eu tenho o seguinte código:

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

Isso produz uma lista suspensa que se parece com:

01 de janeiro 02 de fevereiro 03 março ... 12 de dezembro

Um refinamento adicional poderia ser a de tornar o mês exibido o mês corrente, adicionando:

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

Depois que o loop for.

Aqui está a minha solução, que é muito semelhante à solução de @ Jesse-marrom (a resposta aceita)

VB.NET:

Em uma classe funções globais:

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

Na 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 implementação está em VB.NET porque isso acontece a ser o que este webapp está usando (legado), porém muito obrigado para os exemplos em C # (meu idioma preferido), estou postando o VB.NET aqui para ajudar a comunidade VB.NET também.

Para ASP.NET MVC é isso que eu estou fazendo.

Nota Eu prefiro usar um codebehind para coisas como este -. a sua parte ainda da vista e não há nada de errado com a visão de construir uma SelectList

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

Abaixo código é para mês suspensa carga como Selecione

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

    }

/ Tente este código para vincular todo o mês na lista suspensa sem o uso de banco de dados /

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

Você pode tentar este ... Ref aqui:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top