2016-11-08 59 views
1

请随意使用这个,我完全自学了C#和它的东西,我只有在空闲时间才真正有机会玩这个游戏!dataview rowfilter按照预期工作

我有一个包含一列布尔类型的数据表。我将此表绑定到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; 
      } 
     } 
    } 
} 

该代码并成功地检查行中的复选框,但如果我那么去勾选“显示经过行”该行不包含在最终的过滤视图。如果我手动检查几行,然后使用+符号选中一行,则会显示手动检查的所有行,但使用+符号的行不会。我调试了代码,以确保布尔肯定被设置为True行,现在我很难过!任何帮助将非常感激。

+0

好的,只是做了一些更多的测试,需要澄清。如果我使用+符号勾选一行,然后勾选“显示选定的记录”,则不显示记录。如果我先手动勾选另一条记录,然后勾选“显示选定记录”,则会显示两条记录。 –

+0

也许你需要添加“==真”来检查? – starko

+0

感谢您的评论starko,我给了一个尝试,但它没有帮助。我有一种感觉,它不会像我手动检查单元格时完全相同的过滤器语法。为了简单起见,我现在创建了一个新的项目,它只有一个datagridview,一个文本框(搜索)和一个复选框(显示选中的行),然后将代码剥离回基础,不幸的是我仍然有同样的问题。 –

回答

0

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

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