如何从 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
个对象。
我有一个 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
个对象。