在comboBox中列出时,将DateTime字符串转换为仅日期

时间:2014-10-28 15:09:45

标签: c# date datetime datagridview combobox

我有dataGridView_flaggedComments,其中有一个名为Comments_Date的列(其格式为31/12/2014 01:10:11 PM),我将日期部分添加到comboBox_stockDates,如果有的话是几个相同的日期,例如31/12/2014,我只希望它在comboBox_stockDates中显示一次,而不是重复。

这是我的代码,它会列出每一行中的所有日期和时间,但不会抓住仅限日期的部分。任何人都可以指出我应该纠正我的代码的哪一部分?或者如果有指导的话会很棒。如果我忽略了任何类似的问题,我会道歉。非常感谢你!

private void PopulateStockDatesIndex()
{
    comboBox_stockDates.Items.Clear();
    comboBox_stockDates.Items.Add("Choose to Filter");
    comboBox_stockDates.FormatString = "dd-MM-yyyy";
    DataView dataview_filterDate = (DataView)(dataGridView_flaggedComments.DataSource);
    foreach (DataRowView rowView in dataview_filterDate)
    {
        DataRow row = rowView.Row;
        for (int i = 0; i < dataGridView_flaggedComments.Rows.Count - 1; i++)
        {
            if (dataGridView_flaggedComments.Rows[i].Cells["Comments_Date"].Value.ToString() != "")
            {
                if (!comboBox_stockDates.Items.Contains(row[1].ToString()))
                {
                    comboBox_stockDates.Items.Add(row[1].ToString());
                }
                comboBox_stockDates.SelectedIndex = 0;
            }
        }
    }
}

第二版

private void PopulateStockDatesIndex()
{
    comboBox_stockDates.Items.Clear();
    comboBox_stockDates.Items.Add("Choose to Filter");
    comboBox_stockDates.FormatString = "dd-MM-yyyy";

    foreach (DataGridViewRow row in dataGridView_flaggedComments.Rows)
    {
        for (int i = 0; i < dataGridView_flaggedComments.Rows.Count - 1; i++)
        {
            if (dataGridView_flaggedComments.Rows[i].Cells["Comments_Date"].Value.ToString() != "")
            {
                string date = row.Field<DateTime>(1).ToString("dd-MM-yyyy");
                if (!comboBox_stockDates.Items.Contains(date))
                {
                    comboBox_stockDates.Items.Add(date);

                }
                comboBox_stockDates.SelectedIndex = 0;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:6)

DateTime.ToString返回DateTime的字符串表示形式,其中包含时间部分。如果您只想要日期部分,则可以使用dt.ToString("d")dt.ToShortDateStringdt.ToString("dd-MM-yyyy")

string date = row.Field<DateTime>(1).ToString("dd-MM-yyyy");
if (!comboBox_stockDates.Items.Contains(date))
{
    comboBox_stockDates.Items.Add(date);
}

您还可以使用LINQ,如果需要,还可以对日期进行排序:

string[] distinctDates = dataview_filterDate.Table.AsEnumerable()
    .Select(row => row.Field<DateTime>(1).Date) // Date is used to get Distinct dates by day
    .Distinct()
    .OrderBy(dt => dt)
    .Select(dt => dt.ToString("dd-MM-yyyy"))
    .ToArray();
comboBox_stockDates.Items.AddRange(distinctDates);

答案 1 :(得分:1)

这对我有用: 从您的DateTime列表中仅选择Date元素进入新列表,然后创建一个Dates属性。

public List<DateTime> Dates => dataGridView_flaggedComments.Rows.Select(el => el.Field<DateTime>(1).Date).Distinct().ToList();
.xaml文件中的

将ComboBox绑定到Dates属性。

 <ComboBox Name="DateSelection" ItemsSource="{Binding Dates}"/>