4

我正在开发一个 WPF 项目,我有一个月份组合框,它应该包含从一月到十二月的几个月。我通过以下代码片段设法做到了;

var americanCulture = new CultureInfo("en-US");
ddlMonth.Items.AddRange(americanCulture.DateTimeFormat.MonthNames);

并得到列表;

January
February
March
....

但我希望它们填充为 ;

01 - January
02 - February
03 - March
.....

任何想法如何进行 for 循环?我是 C# 的新手。谢谢

4

4 回答 4

5
      var americanCulture = new CultureInfo("en-US");
      var count = 1;
      //.Take(12) in the foreach below because apparantly MonthNames returns 13
      //elements of which the last one is empty
      foreach (var month in americanCulture.DateTimeFormat.MonthNames.Take(12))
      {    
      DropDownList1.Items.Add(new ListItem{Text = count.ToString("00") + "-" + month});
      count++;
      }
于 2013-04-07T09:40:11.070 回答
5

诺。你为什么在后台做。利用 wpf 并使用 xaml。

让我试着解释一下如何做到这一点。

  1. 首先为 Months 创建一个依赖属性。如果您没有使用依赖属性。您现在应该研究它们http://wpftutorial.net/DependencyProperties.html。在下面的代码中,我通过 new PropertyMetadata(new CultureInfo("en-US").DateTimeFormat.MonthNames.Take(12).ToList())) 将属性的默认值设置为月份列表。所以现在我们可以从 xaml 中获取这个属性。

    public partial class MainWindow : Window
    {
    public static readonly DependencyProperty MonthsProperty = DependencyProperty.Register(
        "Months", 
        typeof(List<string>), 
        typeof(MainWindow), 
        new PropertyMetadata(new CultureInfo("en-US").DateTimeFormat.MonthNames.Take(12).ToList()));
    
    public List<string> Months
    {
        get
        {
            return (List<string>)this.GetValue(MonthsProperty);
        }
    
        set
        {
            this.SetValue(MonthsProperty, value);
        }
    }
    public MainWindow()
    {
        InitializeComponent();            
    }
    

    }

  2. 你需要一个转换器。 http://wpftutorial.net/ValueConverters.html如果不熟悉它们。转换器要做的是对于列表中的每个值,我们将修改字符串以获得所需的结果。因此,为值转换器创建一个新类。

    [ValueConversion(typeof(List<string>), typeof(List<string>))]
    public class MonthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
        //get the list of months from the object sent in    
        List<string> months = (List<string>)value;
    
        //manipulate the data index starts at 0 so add 1 and set to 2 decimal places
        if (months != null && months.Count > 0)
        {
            for (int x = 0; x < months.Count; x++)
            {
                months[x] = (x + 1).ToString("D2") + " - " + months[x];
            }
        }
    
        return months;
    }
    
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    
    #endregion
    

    }

  3. 在 xaml 中设置它。为您的窗口创建一个名称,即 x:Name="testWindow",这样可以在绑定时更好地访问它。设置您的命名空间,以便您可以获取转换器。xmlns:Main="clr-命名空间:WpfApplication4"。将转换器添加到资源中,. 在组合框中,将 itemssource 绑定到您的依赖属性 Months 并通过转换器发送。

    <Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="testwindow"
        xmlns:Main="clr-namespace:WpfApplication4"
        Title="MainWindow" Height="350" Width="525">
    
        <Window.Resources>
            <Main:MonthConverter x:Key="MonthConverter"/>
        </Window.Resources>
    
        <Grid>
            <ComboBox ItemsSource="{Binding ElementName=testwindow,Path=Months, Converter={StaticResource MonthConverter}}" HorizontalAlignment="Left" Margin="197,107,0,0" VerticalAlignment="Top" Width="120"/>
    
        </Grid>
    </Window>
    
于 2013-04-07T18:03:04.143 回答
2

尝试这个:

   List<string> names = new List<string>();
        int num = 1;
        foreach (var item in americanCulture.DateTimeFormat.MonthNames)
        {
            names.Add(string.Format("{0} - {1}", num++.ToString("D2"), item));
        }
        ddlMonth.Items.AddRange(names);
于 2013-04-07T09:40:28.030 回答
2

最好的方法是为当天设置一个组合框,为当月设置一个组合框。

填充月份和日期

用途

for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++) {
    cmbDay.Items.Add(i.ToString());
}
于 2013-04-07T09:40:35.200 回答