2009-05-01 15 views
10

Mam wewnętrzną aplikację, która musi mieć rozwijaną listę dla dwóch elementów typu daty: Miesiąc i Rok. Wartości te nie znajdują się w bazie danych lub innym repozytorium informacji.Jaki jest najlepszy sposób, aby zakodować listę rozwijaną miesiąca i roku dla ASP.NET?

wiem, może po prostu setup listę z wartościami muszę dodając je do słownika podobnego przedmiotu (muszę skorelować miesiąca do reprezentacji liczbowej, styczeń => 01):

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

Lista rozwijana na rok będzie nieco łatwiejsza, ponieważ mogę wybrać rok rozpoczęcia i powtarzać do bieżącego lub bieżącego + 1 roku na liście ogólnej.

Czy istnieje lepszy sposób na obsługę tych elementów danych? Coś wbudowanego lub dobry wzór, który powinienem wdrożyć?

+0

Ciekawe pytanie, miałem to samo pytanie raz. +1 – pyrocumulus

+0

Czy chcesz zlokalizować tę wartość? – Greg

+0

Lokalizacja nie jest wymagana, ale jeśli już istnieje w zlokalizowanym stanie, nie zaszkodzi. –

Odpowiedz

23

Możesz użyć tego, aby uzyskać listę wszystkich nazw miesięcy i przechodzić przez nie.

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames 

Można go używać tak ... za pomocą indeksu miesiąca jako wartości dla listy rozwijanej

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

Czy istnieje sposób corolate nazwa miesiąca z reprezentacji numerycznej (tj. January => 1)? –

+0

sprawdź edycję, dodałem jej użycie. – Jab

+0

Tablica zwrócona przez CultureInfo.InvariantCulture.DateTimeFormat.MonthNames zawiera "January", "February", "March", "April", "May", "June", "July", "August", "September", "Październik", "listopad", "grudzień" i "" w kolejności. Możesz użyć pętli for, aby uzyskać indeks dla każdej wartości. – Greg

4

Rozszerzanie odpowiedź @Jesse Browna ...

Mając na przy użyciu dyrektywy System.Globalization, mam następujący kod:

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

ten tworzy listę rozwijaną, która wygląda tak:

01 stycznia 02 luty 03 marzec ... 12 grudnia

dalsze udoskonalenie może być, aby wyświetlane miesiąc bieżący miesiąc dodając:

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

Po pętli for.

2

Oto moje rozwiązanie, które jest bardzo podobne do rozwiązania @ Jesse-Browna (przyjętą odpowiedź)

VB.NET:

W globalnej klasy funkcje:

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 

Włączone strona 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 

Ta implementacja jest w VB.NET, ponieważ tak się dzieje być tym, czego używa ta aplikacja (dziedzictwo), ale bardzo dziękuję za przykłady w C# (moim preferowanym języku), zamieszczam tutaj VB.NET, aby pomóc także społeczności VB.NET.

2

Dla ASP.NET MVC to właśnie robię.

Notatka I prefer to use a codebehind za takie rzeczy - jest to nadal część widoku i nie ma nic złego w tym, że widok tworzy listę wyboru.

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

Kiedy używam tego 'publiczne IEnumerable ExpirationMonthDropdown { ' w mojej klasie modelu Dostaję następujący błąd 'nazwą„model”nie istnieje w bieżącym context' – kez

1

Poniżej kod jest dla obciążenia miesięcznego rozwijanym jako Wybierz

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

Podaj objaśnienia dotyczące kodu. W ten sposób twoja odpowiedź będzie bardziej przydatna. – mastov

-1

Można spróbować to ... Ref tutaj:

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

W tym miejscu odradzane są zarówno odpowiedzi dotyczące wyłącznie linków, jak i odpowiedzi tylko do kodu. Czy możesz edytować swoją odpowiedź, aby wyjaśnić, w jaki sposób rozwiązuje to problem PO? –

Powiązane problemy