C# 使用日期筛选datagridview

C# 使用日期筛选datagridview,c#,winforms,datagridview,datetimepicker,C#,Winforms,Datagridview,Datetimepicker,我正试图通过两个日期时间选择器(startDate和endDate)过滤datagridview中的截止日期列 datagridview是TaskTable2, datetimepicker1是startSchedule, datetimepicker2是endSchedule和 datagridview中的截止日期为deadlineRow 到目前为止,我已经得到了以下代码,它成功地使不在所选开始日期和结束日期之间的行不可见 private void scheduleButton_Click(o

我正试图通过两个日期时间选择器(startDate和endDate)过滤datagridview中的截止日期列

datagridview是TaskTable2, datetimepicker1是startSchedule, datetimepicker2是endSchedule和 datagridview中的截止日期为deadlineRow

到目前为止,我已经得到了以下代码,它成功地使不在所选开始日期和结束日期之间的行不可见

private void scheduleButton_Click(object sender, EventArgs e)
    {

        DateTime startSchedule = startDate.Value.Date;
        DateTime endSchedule = endDate.Value.Date;

        if (startSchedule <= endSchedule)// runs foreach loop if startdate and enddate are valid
        {
            foreach (DataGridViewRow dr in TaskTable2.Rows)// loops through rows of datagridview
            {
                string deadline = dr.Cells["Deadline"].Value.ToString(); // gets deadline values
                DateTime deadlineRow = Convert.ToDateTime(deadline); // converts deadline string to datetime and stores in deadlineRow variable

                if (startSchedule <= deadlineRow && deadlineRow <= endSchedule) // filters deadlines that are => startDate and <= endDate
                {
                    dr.Visible = true; // display filtered rows here.
                }
                else
                {
                    dr.Visible = false; // hide rows that are not beteen start and end date.
                }

            }
        }
        else
        {     
            MessageBox.Show("Please ensure Start Date is set before End Date."); // ensures user selects an end date after the start date.
        }
    }
private void scheduleButton\单击(对象发送方,事件参数e)
{
DateTime startSchedule=startDate.Value.Date;
DateTime endSchedule=endDate.Value.Date;

如果(startSchedule,我将对
datagridview
使用
bindingsource
上的
Filter
属性。使用
Filter
属性可以查看数据源的子集

示例来自:

private void填充数据视图和过滤器()
{
数据集set1=新数据集();
//用于填充数据集的一些xml数据。
弦乐=
"" +
"" +
"


在不存在的日期使用筛选器不会使应用程序崩溃,它只会显示任何内容。

在此处找到了异常的解决方案:

在尝试将行设置为不可见之前,我已将其直接添加到代码中。
row
是我的
ForEach
循环变量。在设置
visible
属性之前,我会检查其是否选中,以及是否尝试清除行和单元格选择

            If gridItems.SelectedRows.Count > 0 AndAlso row.Index = gridItems.SelectedRows(0).Index Then
                'fixes dumb exception with row.visible = false 
                gridItems.ClearSelection()
                gridItems.CurrentCell = Nothing
            End If

问题似乎在于使当前行或单元格不可见。

我遇到了完全相同的问题,唯一的例外是“不能使与货币经理职位相关的行不可见”

dgridView.CurrentCell = null;
dgridView.Rows[i].Visible = false;

只需将CurrentCell设置为null,我就可以修复它。如果它损坏了某些内容,我没有进一步检查它。

看起来您甚至不需要先清除所选内容;只需将CurrentCell设置为null/nothing,我就可以解决这个问题。谢谢您的提示!
dgridView.CurrentCell = null;
dgridView.Rows[i].Visible = false;