2009-05-01 25 views
10

Tôi có đơn đăng ký nội bộ mà tôi cần có danh sách thả xuống cho hai yếu tố loại ngày: ThángNăm. Các giá trị này không nằm trong cơ sở dữ liệu hoặc kho lưu trữ thông tin khác.Cách tốt nhất để mã hóa danh sách thả xuống Tháng và Năm cho ASP.NET là gì?

Tôi biết tôi có thể chỉ cần thiết lập một danh sách với các giá trị tôi cần bằng cách thêm chúng vào một cuốn từ điển như đối tượng (tôi cần phải đồng bộ hóa việc đầu tháng cho đến các mô tả bằng số, tháng => 01):

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

Danh sách thả xuống cho năm sẽ dễ dàng hơn một chút vì tôi chỉ có thể chọn một năm bắt đầu và lặp lại đến hiện tại hoặc hiện tại + 1 năm trong danh sách chung.

Có cách nào tốt hơn để xử lý các yếu tố dữ liệu này không? Cái gì được xây dựng trong, hoặc một mẫu thiết kế tốt mà tôi nên thực hiện?

+0

Câu hỏi thú vị, tôi đã có cùng một câu hỏi một lần. +1 – pyrocumulus

+0

Bạn có cần bản địa hóa giá trị này không? – Greg

+0

Việc bản địa hóa không phải là một yêu cầu, tuy nhiên nếu nó đã tồn tại ở trạng thái cục bộ, nó sẽ không bị tổn thương. –

Trả lời

23

Bạn có thể sử dụng quyền này để có danh sách tất cả các tên Tháng và lặp qua nó.

CultureInfo.CurrentCulture.DateTimeFormat.MonthNames 

Bạn có thể sử dụng nó như thế này ... bằng cách sử dụng chỉ số của tháng làm giá trị cho danh sách thả xuống của bạn

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

Có cách nào để sửa đổi tên tháng với biểu diễn dạng số (tức là tháng 1 => 1) không? –

+0

kiểm tra chỉnh sửa, tôi đã thêm sử dụng của nó. – Jab

+0

Mảng trả về bởi CultureInfo.InvariantCulture.DateTimeFormat.MonthNames chứa "January", "February", "March", "April", "May", "June", "July", "August", "September", "Tháng Mười", "Tháng Mười Một", "Tháng Mười Hai" và "" theo thứ tự. Bạn có thể sử dụng vòng lặp for để lấy chỉ mục cho từng giá trị. – Greg

4

Mở rộng câu trả lời @Jesse Brown ...

Với sử dụng chỉ thị System.Globalization, tôi có mã sau:

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

này tạo ra một danh sách thả xuống trông giống như:

01 tháng một 02 Tháng hai 03 tháng 3 ... 12 Tháng 12

Một tinh tế hơn nữa có thể là để làm cho tháng hiển thị tháng hiện tại bằng cách thêm:

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

Sau vòng lặp for.

2

Đây là giải pháp của tôi, mà là rất tương tự như giải pháp @ jesse nâu của (các câu trả lời được chấp nhận)

VB.NET:

Trong một lớp chức năng toàn cầu:

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 

On trang 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 

Thực hiện này bằng VB.NET vì điều đó xảy ra để được những gì webapp này đang sử dụng (di sản), tuy nhiên cảm ơn bạn rất nhiều cho các ví dụ trong C# (ngôn ngữ ưa thích của tôi), tôi đăng bài VB.NET ở đây để giúp cộng đồng VB.NET là tốt.

2

Đối với ASP.NET MVC, đây là những gì tôi đang làm.

Lưu ý I prefer to use a codebehind cho những thứ như thế này - phần còn lại của chế độ xem và không có gì sai với chế độ xem xây dựng một danh sách lựa chọ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) 
       }); 
      } 
     } 
    } 
+0

Khi tôi sử dụng 'công khai IEnumerable ExpirationMonthDropdown {'bên trong lớp mô hình của tôi, tôi nhận được lỗi sau' Tên 'Mô hình' không tồn tại trong ngữ cảnh hiện tại ' – kez

1

Dưới đây đang cho tháng thả xuống tải như Chọn

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

Vui lòng cung cấp một số giải thích về mã của bạn. Bằng cách này, câu trả lời của bạn sẽ hữu ích hơn. – mastov

-1

Bạn có thể thử này ... Ref đây:

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

Xin chào, cả câu trả lời chỉ có liên kết và câu trả lời chỉ có mã được khuyến khích ở đây. Bạn có thể chỉnh sửa câu trả lời của mình để giải thích cách giải quyết vấn đề của OP không? –

Các vấn đề liên quan