如何从 BindingList C# 更新 DataGridView

How to update DataGridView from BindingList C#

我有一个 Windows 表单应用程序。它有一个名为 dgvCalendar 的 DataGridView。 dgv 从数据库中提取数据,我已经确认(据我所知)那里没有问题。

该表单还有两个按钮:btnAll,显示日历中的所有约会并按预期工作; btnMonth 应该只显示当月的约会。

我已确认当月至少有 1 个约会,但当我单击该按钮时,dgv 变为空白。

如果我单击 btnAll,它会按预期再次填充。

public partial class Main: Form
{
    // I know that this populates from the database correctly
    static BindingList<Appointment> allAppts = DbManager.GetAppointmentsByUserId();

//...

private void btnAll_Click(object sender, EventArgs e)
{
    // This works just fine
    dgvCalendar.DataSource = null;
    dgvCalendar.DataSource = allAppts;
}

private void btnMonth_Click(object sender, EventArgs e)
{

    // THIS IS WHERE THE TROUBLE IS...

    DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
    System.Globalization.Calendar cal = dfi.Calendar;

    // MessageBox output is "My Month: 3" which is what I expect (it's March)
    MessageBox.Show("My Month: " + DateTime.Now.Month.ToString()); 
    
    dgvCalendar.DataSource = null;
    dgvCalendar.DataSource = allAppts.Where( 
        a => DateTime.Parse(a.start).Month == DateTime.Now.Month
    ); 
}

//...

}

我很确定问题出在代码过滤 BindingList 时。当代码应用过滤器时...

dgvCalendar.DataSource = allAppts.Where(
         a => DateTime.Parse(a.start).Month == DateTime.Now.Month);

这将返回一个 IEnumerable<Appointment>,网格显然无法处理。

幸运的是,通过在代码行末尾添加 .ToList()IEnumerable 转换为列表应该会按预期在网格中显示过滤后的数据。像……

dgvCalendar.DataSource = allAppts.Where(
         a => DateTime.Parse(a.start).Month == DateTime.Now.Month).ToList();

此外,您似乎将日期存储为 string,这只会为您创造更多工作。我建议您将日期存储为 DateTime 个对象。