dataview rowfilter未按预期工作

时间:2016-11-08 12:11:10

标签: c# dataview rowfilter

请用这个轻松告诉我,我完全用C#自学,这是我在业余时间真正有机会玩的东西!

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

填充datagrid:

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;
            }
        }
    }
}

该代码确实成功检查了该行中的复选框,但是如果我然后去检查"显示Checked Rows"该行未包含在生成的过滤视图中。如果我手动检查几行然后使用+符号检查一行,则会显示我手动检查的所有行,但使用+符号的行则不会。我调试了代码,以确保该行的bool肯定被设置为True,现在我很难过!任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

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

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