【问题标题】:DataSet Filter between 2 dates2个日期之间的数据集过滤器
【发布时间】:2012-03-15 16:40:46
【问题描述】:

您好,我几天前发布了一个类似的问题,并被告知使用数据集过滤器来过滤我的 datagridview。我已经尝试过了,但我正在努力弄清楚如何去做。

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

datagridview 是TaskTable2,datetimepicker1 是startSchedule,datetimepicker2 是endSchedule,datagridview 中的deadline 是deadlineRow

底层数据源中的TaskDataSet。

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

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.
                    TaskTable2.CurrentCell = null;
                }

            }
        }
        else
        {    
            MessageBox.Show("Please ensure Start Date is set before End Date."); // ensures user selects an end date after the start date.
        }
    }

但是,我有一些现有的问题:

  1. 使用可见属性是错误的方法,我需要使用类似以下的方法过滤数据集(不知道该怎么做)

    TaskDataSet.Filter = "startSchedule <= Deadline AND Deadline <= endSchedule";
    
  2. 我有一个打印按钮,应该打印过滤后的 结果。但是,它正在打印存储在 datagridview,即使某些行是可见的=假按下 计划按钮,这就是为什么我需要过滤数据集,然后 在打印事件中使用它。

datagridview 绑定到一个 XML 文件,因此只要数据保留在 XML 文件中,就可以从 datagridview 中删除数据以进行过滤和打印。

如果有人可以使用数据集过滤器而不是使用可见属性来修改我的代码,那将不胜感激。

谢谢!

【问题讨论】:

    标签: c# datagridview filter dataset


    【解决方案1】:

    您的过滤代码可能是:

    DateTime startSchedule = startDate.Value.Date;
    DateTime endSchedule = endDate.Value.Date;
    
    TaskDataSet.Filter = "Deadline >='" + startSchedule + "' AND Deadline <= '" + endSchedule + "'";
    

    关于打印过滤结果的第二个问题 - 在 VB.NET 中在线找到此链接,但您可以将其转换为 C#

    Print DataSet or DataTable contents from VB.NET

    您也可以尝试DataSet.Clone() 并遍历行以删除过滤的项目,然后打印剩余的记录。

    DataGridView Printing by Selecting Columns/Rows

    How can I print data from a DataGridView in C#?

    【讨论】:

    • 我可以使用你发布的第二个链接中的 if 语句 - if(!GridCol.Visible) 来过滤掉可见=false 的行以进行打印吗?
    • @Rob 您必须对其进行测试以查看它是否有效。我的任何应用程序都没有打印功能。
    【解决方案2】:

    假设您的数据集名为“ds”并且数据存储在第一个表中,您可以这样做:

    ds.Tables[0].DefaultView.RowFilter = 
        string.Format("Deadline between ( {0}, {1})",startSchedule,endSchedule );
    

    请注意,我没有对此进行测试。

    【讨论】:

    • DataTables 过滤器不支持 between
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2019-05-29
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多