数据视图行过滤器未按预期工作

Posted

技术标签:

【中文标题】数据视图行过滤器未按预期工作【英文标题】:dataview rowfilter not working as expected 【发布时间】:2017-03-22 01:29:25 【问题描述】:

请放轻松,我完全是自学 C# 的,我只有在业余时间才有机会玩它!

我有一个包含一列布尔类型的数据表。我将此表绑定到 datagridview 并使用布尔类型显示一列空复选框,然后用户可以选中任意行数旁边的框。我在表单上还有一个“显示选中的行”复选框,选中后,过滤 datagridview 以仅显示选中的行,代码如下所示:

填充数据网格:

public void fillDatagridView()

    dtMembers.Columns.Add("Print", typeof(bool));
    dtMembers.Columns.Add("Contact ID", typeof(string));
    dtMembers.Columns.Add("Membership Number", typeof(int));
    dtMembers.Columns.Add("First Name", typeof(string));
    dtMembers.Columns.Add("Last Name", typeof(string));
    dtMembers.Columns.Add("Current Application Type", typeof(string));
    dtMembers.Columns.Add("Email Address", typeof(string));
    dtMembers.Columns.Add("Membership Type", typeof(string));
    dtMembers.Columns.Add("Approval Date", typeof(DateTime));

    dgMembers.DataSource = dtMembers;

“显示检查的行”检查事件:

private void cbShowSelected_CheckedChanged(object sender, EventArgs e)

    if (cbShowSelected.Checked)
        dtMembers.DefaultView.RowFilter = "Print = True";
    else
        dtMembers.DefaultView.RowFilter = string.Empty;

当用户勾选不同的行然后检查“显示检查的行”时,上面的代码工作正常,所以到目前为止一切都很好。将有几个用户需要检查大量行,因此,为了可用性,我添加了代码,以便如果他们在搜索文本框中键入会员编号,datagridview 将被过滤为该会员编号,此外,如果用户键入 + 符号并且过滤视图中只有一行,那么它将勾选该行。我使用以下代码做到了这一点:

private void textBox1_TextChanged(object sender, EventArgs e)

    if (textBox1.Text.Length > 0)
    
        if (textBox1.Text.Substring(textBox1.Text.Length - 1) != "+")
        
            dtMembers.DefaultView.RowFilter = string.Format("[_RowString] LIKE '%0%'", textBox1.Text);
        
        else
        
            if (dgMembers.DisplayedRowCount(false) == 1)
            
                dgMembers.Rows[dgMembers.FirstDisplayedCell.RowIndex].Cells[0].Value = true;
                textBox1.Text = string.Empty;
            
        
    

该代码确实成功地检查了该行中的复选框,但如果我随后检查“显示已检查的行”,则该行不包含在生成的过滤视图中。如果我手动检查几行,然后使用 + 符号检查一个,那么我手动检查的所有行都会显示,但使用 + 符号的行不会显示。我调试了代码以确保该行的 bool 肯定设置为 True,现在我很难过!任何帮助将不胜感激。

【问题讨论】:

好的,刚刚做了一些测试,需要澄清一下。如果我使用 + 符号勾选一行,然后勾选“显示选定的记录”,它不会显示该记录。如果我先手动勾选另一条记录,然后勾选“显示选定记录”,那么它会显示两条记录。 也许您需要添加“==true”来检查? 感谢您的评论 starko,我试了一下,但没有帮助。我有一种感觉,当我手动检查一个单元格时,它不会因为完全相同的过滤器语法起作用。为了让事情变得简单,我现在创建了一个新项目,它只有一个数据网格视图、一个文本框(搜索)和一个复选框(显示选中的行)并将代码直接剥离为基础,不幸的是我仍然有同样的问题。 【参考方案1】:

我最终自己解决了这个问题,我相信问题在于我设置的是 DataGridView 值,而不是 DataGridView 绑定到的 DataTable 中的值。所以现在我使用下面的代码来代替它:

BindingManagerBase bm=this.dgMembers.BindingContext[this.dgMembers.DataSource, this.dgMembers.DataMember];
DataRow dr = ((DataRowView)bm.Current).Row;
dr["print"] = true

【讨论】:

以上是关于数据视图行过滤器未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

聚合窗口中的过滤器子句未按预期丢弃行

VUE3 复合过滤器未按预期工作

Spark 过滤器未按预期工作。“列”对象不可调用

Oauth2 安全配置匹配器请求过滤未按预期工作

核心图像过滤器 CISourceOverCompositing 未按预期显示与 alpha 叠加

CSS 背景颜色未按预期运行