好的,所以您的数据在数据表中。如果您还没有这样做,那么在 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 值更改时会更改过滤器