DataSet在2个日期之间过滤

时间:2012-03-15 16:40:47

标签: c# datagridview filter dataset

您好我几天前发布了一个类似的问题,我被告知使用数据集过滤器来过滤我的datagridview。我有一个去,但我正在努力找出如何做到这一点。

我正在尝试使用2 datetimepickers - startDate和endDate过滤datagridview中的截止日期列。

datagridview是TaskTable2,datetimepicker1是startSchedule,datetimepicker2是endSchedule,datagridview中的截止日期是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. 使用visible属性是错误的方法,我需要使用以下内容过滤数据集(不知道如何操作)

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

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

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

    谢谢!

2 个答案:

答案 0 :(得分:2)

您过滤代码可能是:

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#?

答案 1 :(得分:-2)

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

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

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