禁止或取消对数据网格视图编辑的筛选器
本文关键字:编辑 视图 筛选 网格 数据网 取消 数据 禁止 | 更新日期: 2023-09-27 18:33:25
我有允许编辑的DataGridView(ReadOnly = false)。DataGridView 还可以具有一个或多个与其数据源关联的筛选器。例如:
(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = "[myColumn] = 'value'";
如果应用了筛选器,并且用户编辑了 myColumn 中的字段,则该行将立即"消失",因为它不再满足筛选器的条件。有没有办法禁止或取消此操作?理想情况下,我希望用户"刷新"网格,以便随意重新应用过滤器。
您可以简单地在某个Refresh
方法中设置RowFilter
,并且仅在那时调用该方法。但是,您必须在某些适当的事件处理程序(如 CellEndEdit
事件处理程序)中向RowFilter
添加一些or
条件,以防止当前行消失,无论用户输入什么值:
string baseFilter = "[myColumn] = 'value'";
//CellEndEdit event handler for your myDataGridView
private void myDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e){
(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = baseFilter + " OR [myColumn] = '" + myDataGridView[e.ColumnIndex,e.RowIndex].Value + "'";
}
//you can call this method such as in some Click event handler of some Refresh Button
public void RefreshGrid(){
(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = baseFilter;
}
"King
King"所说的mehod不是很好,因为它也会导致显示该列具有相似值的所有其他行。
您可以选择避免使用 DataTable.DefaultView.RowFilter
的自动筛选机制,而是对 DataGridView 的所有行执行循环,并检查筛选条件以设置每一行Visible
属性。
void applyFilter()
{
foreach (DataGridViewRow row in grid1.Rows)
{
string columnA = row.Cells["ColumnA"].Value as string;
string columnB = row.Cells["ColumnB"].Value as string;
row.Visible = (columnA == "valueA" && columnB == "valueB");
}
}
您也可以使用类似以下内容:columnA.IndexOf("valueA", StringComparison.OrdinalIgnoreCase) > -1
使用"包含"条件进行搜索(如 RowFilter = '%valueA%'
)。