这是我想要做的。我有一个表单,上面有一个'filter'组合框和一个DataGridView,它显示数据库中的数据(我使用DataSet.Tables[0].DefaultView
属性分配了数据。组合框有一个项目列表,可以在数据库中找到,加上一个自定义添加的(命名)。当用户选择其中一个项目时,我运行以下代码:
int filterID = ( int )this.cbxFilter.SelectedValue;
DataView view = this.dgvScenarios.DataSource as DataView;
if ( filterID > 0 ) {
view.RowFilter = string.Format( "Season = {0}", this.cbxFilter.SelectedValue );
} else {
view.RowFilter = string.Empty;
}
现在,这很有效,因为<All>
项是第0项。现在,我可以在表单上更改'过滤'属性,季节。它有一个类似的组合框,其中包含与“过滤器”框相同的所有数据,减去<All>
项。当用户更改此值时,这就是运行的内容:
if ( this._loading ) {
return;
}
ComboBox cbx = sender as ComboBox;
int rows = this.UpdateDataFromControl( cbx.Tag, cbx.SelectedValue );
if ( rows <= 0 ) {
return;
}
this.UpdateDGVCell( cbx.Tag, cbx.SelectedValue, "ID" );
this.UpdateDGVCell( cbx.Tag, cbx.Text, "Text" );
现在,我认为DataView会更新数据网格,但它没有做任何事情,我无法弄清楚如何在不将数据再次加载到数据集中的情况下进行此刷新,这将对性能产生影响因为我再次访问数据库,然后将其过滤掉。我错过了一些我在谷歌上找不到的东西吗?感谢您的帮助,如果需要更多信息,请告诉我们!
答案 0 :(得分:0)
您是否有理由使用表格的DataView,而不是使用BindingSource中的表格?我发现BindingSource很容易使用。
在代码中的某处,您可能会遇到以下情况:
dataGridView.DataSource = yourDataSource;
如果用
替换它this.bindingSource = new BindingSource();
this.bindingSource.DataSource = yourDataSource;
dataGridView.DataSource = this.bindingSource;
然后您可以应用过滤(自动触发事件以更新DataGridView显示),如下所示:
this.bindingSource.Filter = "Season = 'x'"; //automatically updates the dataGridView
要删除过滤器,您可以使用
this.bindingSource.RemoveFilter(); //automatically updates the dataGridView
这是否解决了您要做的事情?