我有一个内部应用程序,我需要有两个日期类型元素的下拉列表:月和年。 这些值不在数据库或其他信息存储库中。
我知道我可以通过将所需值添加到类似对象的字典中来设置一个列表(我需要将月份与数字表示相关联,一月 => 01):
var months = new Dictionary<String,String>();
months.Add("01", "January");
...
年份的下拉列表会更容易一些,因为我只需选择起始年份并在通用列表中迭代到当前或当前+1 年。
有没有更好的方法来处理这些数据元素? 内置的东西,或者我应该实施的良好设计模式?
您可以使用它来获取所有月份名称的列表并循环遍历它。
CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
您可以像这样使用它...使用月份的索引作为下拉列表的值
var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;
for (int i = 0; i < months.Length; i++)
{
ddl.Items.Add(new ListItem(months[i], i.ToString()));
}
扩展@Jesse Brown的答案......
使用 using System.Globalization 指令,我有以下代码:
for (int x = 0; x < 12; x++)
{
cboMonth.Items.Add
(
(x+1).ToString("00")
+ " "
+ CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(x)
);
}
这会生成一个如下所示的下拉列表:
1月1日 2月2日 3月3日 ... 12 月 12 日
进一步的改进可能是通过添加以下内容使显示的月份成为当前月份:
cboMonth.Text = DateTime.Now.Month.ToString("00")
+ " "
+ CultureInfo.CurrentCulture.DateTimeFormat.MonthNames.GetValue(DateTime.Now.Month);
for 循环之后。
这是我的解决方案,与@jesse-brown的解决方案(已接受的答案)非常相似
VB.NET:
在全局函数类中:
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
在 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
这个实现是在 VB.NET 中实现的,因为这恰好是这个 web 应用程序正在使用的(遗留),但是非常感谢您提供 C#(我的首选语言)中的示例,我在这里发布 VB.NET 以帮助VB.NET 社区也是如此。
下面的代码用于加载月份下拉列表,如Select
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()));
}
}
对于 ASP.NET MVC,这就是我正在做的事情。
注意对于这样的事情,我更喜欢使用代码隐藏 - 它仍然是视图的一部分,并且视图构造 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)
});
}
}
}
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()));
}
}
/尝试使用此代码在下拉列表中绑定所有月份,而不使用数据库/
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;
}
for (int Year = 1950; Year <= DateTime.Now.Year; Year++) { DropDownList1.Items.Add(Year.ToString()); }
enter code here
你可以试试这个... 参考这里:
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()))};