仅当在组合框中列出时,才将DateTime字符串转换为日期

本文关键字:DateTime 才将 字符串 转换 日期 组合 | 更新日期: 2023-09-27 18:28:04

我有一个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;
            }
        }
    }
}

仅当在组合框中列出时,才将DateTime字符串转换为日期

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);

这对我很有效:在新列表中只选择DateTime列表中的Date元素,并创建Dates属性。

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

在.xaml文件中将您的组合框绑定到Dates属性。

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