通过datagrid,combobox,datetimepicker搜索

问题描述

我想通过 comboBox datimepicker 进行搜索我有一个表,其中包含3个日期:接收,预报,发送和其他数据,我想然后我的组合框包含先前的标题(3个日期),当我选择其中的一个并且按datetimepicker选择日期时,所选日期的结果将显示在datagrid中

解决方法

确定,因此您的数据在数据表中。如果您还没有这样做,那么在datagridview中显示它的一个简单好方法是通过绑定,如果使用绑定源,我们的生活会变得更加轻松:

DataTable dt = new DataTable();
someDataAdapter.Fill(dt);       //datatable is now full of data

dataGridViewX.DataSource = new BindingSource() { DataSource = dt }; //bind througha  bindingsource

BindingSource支持在基础数据源(一个数据表,实际上是通过表公开的DataView)执行过滤操作。

这意味着我们可以有一个组合框SelectedIndexChanged事件处理程序,例如:

somecombo_SelectedIndexChanged(...){

  var bs = dataGridViewX.DataSource as BindingSource;
  var itm = "forecast"; //i presume it comes from somecombo.SelectedItem etc

  bs.Filter = $"[{itm}] = #{datepicker.Value:yyyy-MM-dd}#";

}

我假设您的组合包含表中各列的名称。如果不是这样,则必须将它们从显示的内容解码为任意的列名称,然后我们将其设置为以下过滤器:

"[forecast] = #2020-09-21#"

对于日期为9月21日的所有记录。请注意,日期也可以包含时间部分,因此,如果您的日期中包含时间,则需要以下内容:

 bs.Filter = $"[{itm}] >= #{datepicker.Value:yyyy-MM-dd}# AND [{itm}] < #{datepicker.Value.AddDays(1):yyyy-MM-dd}# ";

带日期的日期就像带小数的数字:1.234不会与“等于1”匹配,但会与“大于或等于1且小于2”匹配


在dtp上同样有一个事件处理程序,该事件处理程序会在dtp值更改时更改过滤器