为 ASP.NET 编写月份和年份下拉列表的最佳方法是什么?
题
我有一个内部应用程序,我需要有两个日期类型元素的下拉列表: 月 和 年. 。这些值不在数据库或其他信息存储库中。
我知道我可以通过将所需值添加到类似对象的字典中来设置一个列表(我需要将月份与数字表示相关联,一月 => 01):
var months = new Dictionary<String,String>();
months.Add("01", "January");
...
年份的下拉列表会更容易一些,因为我只需选择起始年份并在通用列表中迭代到当前或当前+1 年。
有没有更好的方法来处理这些数据元素?内置的东西,或者我应该实施的良好设计模式?
解决方案
您可以使用它来获取所有月份名称的列表并循环显示它。
CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
您可以像这样使用它...使用Month的索引作为下拉列表的值
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的答案......
使用使用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 社区也是如此。
对于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)
});
}
}
}
以下代码用于选择
的加载月份下拉列表 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()));
}
}
/ 尝试使用此代码在不使用数据库的情况下在下拉列表中绑定所有月份 /
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;
}
你可以尝试这个...... 参考文献:
http://allinworld99.blogspot.com/ 2015/01 /结合 - monthsyear-下拉列表-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()))};