【问题标题】:Datagridview doesn't filtering properlyDatagridview 没有正确过滤
【发布时间】:2015-12-22 12:33:46
【问题描述】:

我的 datagridview 的过滤器有问题。目前,我在我的数据中应用了 3 种类型的过滤器(由 xml 文件加载):

  1. 月份过滤器 => 此过滤器使我能够显示与当前所选月份相关的所有数据
  2. 1 个日期过滤器 => 显示与当前选定日期相关的所有数据
  3. X 日期过滤器 => 显示与当前选定日期相关的所有数据(最多 31 个)

通过在 CalendarMonth 控件上选择日期来应用过滤器。过滤器在这个方法上被激活:

private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
{
    DateTime current_date = this.monthCalendar1.SelectionStart;

    if (current_date.Month != this.old_Date.Month || current_date.Year != this.old_Date.Year)
    {
        (this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = "DATE LIKE '*/" + current_date.ToString("MM/yyyy") + "'";
        System.Console.WriteLine((this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter);
        this.old_Date = current_date;
        this.label_total.Text = this.calculateSum();
        this.label_filter.Text = this.label_total.Text;
        this.label_month.Text = current_date.ToString("MMMM (yyyy)");
    }
    else
    {
        if (this.monthCalendar1.SelectionEnd.ToString("dd/MM/yyyy").Equals(this.monthCalendar1.SelectionStart.ToString("dd/MM/yyyy")))
        {
            (this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = "DATE = '" + this.monthCalendar1.SelectionStart.ToString("dd/MM/yyyy") + "'";
            this.label_filter.Text = this.calculateSum();
        }
        else
        {
            System.Console.WriteLine("DATE >= '" + current_date.ToString("dd/MM/yyyy") + "' AND <= '" + this.monthCalendar1.SelectionEnd.ToString("dd/MM/yyyy") + "'");
            (this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("DATE >= '" + this.monthCalendar1.SelectionStart.ToString("dd/MM/yyyy") + "' And DATE <= '" + this.monthCalendar1.SelectionEnd.ToString("dd/MM/yyyy") + "'");
            this.label_filter.Text = this.calculateSum();
        }
    }
}

当我选择了 X 个日期时,问题就来了。选择日期后,我有一个奇怪的错误。事实上,当我选择 12/10 到 12/12 时,过滤器会显示 10 月和 11 月的结果!没有这些日期的 12 月的数据。

这里是问题的 GIF:

过滤器的日志说:

DATE >= '09/12/2015' AND <= '10/12/2015'
DATE >= '09/12/2015' AND <= '11/12/2015'
DATE >= '09/12/2015' AND <= '12/12/2015'
DATE LIKE '*/01/2016'
DATE LIKE '*/12/2015'

正如我们在 GIF 中看到的,其他 2 个过滤器工作正常。但是 X 选择的日期并没有像它应该做的那样工作..

有人知道这个问题吗?

信息:

  • 视觉工作室(社区)2015
  • C#
  • Windows 窗体
  • 法文系统(法文日期时间,所以 => dd/MM/yyyy)

PS:如果英文不完美,请见谅。

谢谢。

【问题讨论】:

  • 编辑选项似乎不起作用然后我在这里发帖 => 我忘记了论坛消息中的基本信息:“嗨,伙计们。” .

标签: c# windows forms datagridview visual-studio-2015


【解决方案1】:

按下 12 月 21 日会发生什么?如果没有结果,那么您可能应该检查您的DataTable 和/或DataSetLocale,这是您网格的数据源。

以下代码的结果是否符合您的预期 (dd/MM/yyyy)?

Console.WriteLine((this.dataGridView1.DataSource as DataTable).Locale.DateTimeFormat.ShortDatePattern);

【讨论】:

  • 如果我只在 12 月 21 日按下,我将获得 12 月 21 日的所有结果。 1 个选定日期工作文件的过滤器^^。 files.danstools.com/file-convert/result/20151222143827.gif 我不需要使用“Locale.DateTimeFormat”,因为代码给出的所有日期都是在我的语言环境时间(法国系统)。编辑:我已经为 11 月 21 日添加了一个值,当我选择 12 月 21 日时,过滤器仍然很好(仅显示 12 月的结果)。
  • @Bloops 一个问题:哪个 Windows 7?8?10?就在今天,我仅在 Windows 10 上遇到了一个与 MaskedTextBox 和日期格式类似的奇怪问题。所有语言环境都已设置,它仍然试图处理我的日期,就好像我在美国一样。我必须在我的绑定上单独设置 FormatStrings。
  • 我现在正在 Win 7(64 位)上运行我的程序
【解决方案2】:

我已经找到了错误^^。

我使用 String 格式而不是 DateTime 格式的 DATE 列。我已经进行了所有更改(也在 XML 中)以使用 DateTime 值,现在 X 日期的过滤器工作正常!

这里是新过滤方法的代码:

    private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
    {
        DateTime current_date = this.monthCalendar1.SelectionStart;
        // we will identify if is the month/year who as changed or the day (to apply a filter on the data)

        // month/year check
        if (current_date.Month != this.old_Date.Month || current_date.Year != this.old_Date.Year)
        {
            // applying basic month & year filter (standard filter)
            (this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = "[DATE] >= '" + current_date.ToString("01/MM/yyyy") + "' AND [DATE] <= '" 
                + DateTime.DaysInMonth(current_date.Year, current_date.Month).ToString() + current_date.ToString("/MM/yyyy") + "'";
            System.Console.WriteLine((this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter);
            this.old_Date = current_date;
            this.label_total.Text = this.calculateSum();
            this.label_filter.Text = this.label_total.Text;
            this.label_month.Text = current_date.ToString("MMMM (yyyy)");
        }
        else
        {

            if (this.monthCalendar1.SelectionEnd.ToString("dd/MM/yyyy").Equals(current_date.ToString("dd/MM/yyyy")))
            {
                //only one date is selected
                // the day as changed
                (this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = "[DATE] = '" + current_date.ToString("dd/MM/yyyy") + "'";
                System.Console.WriteLine((this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter);
                this.label_filter.Text = this.calculateSum();
            }
            else
            {
                // more than 1 date is selected
                (this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("[DATE] >= '" + current_date.ToString("dd/MM/yyyy") + "' AND [DATE] <= '" + this.monthCalendar1.SelectionEnd.ToString("dd/MM/yyyy") + "'");
                System.Console.WriteLine((this.dataGridView1.DataSource as DataTable).DefaultView.RowFilter);
                this.label_filter.Text = this.calculateSum();
            }
        }
    }

感谢@Arie 的帮助;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多