2016-11-08 12 views
1

私はこれで簡単に行きます。私は完全にC#とその何かで教えています。私は余暇の中で本当に遊ぶ機会を得ます!dataview rowfilterは期待通りに動作しません

私はブール型の1つの列を含むデータテーブルを持っています。私はこのテーブルを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; 
} 

「ショー私も、チェックされている場合、行をチェックするだけのショーへのDataGridViewをフィルタリングし、フォーム上のチェックボックスを「ショーが行をチェックし、」持っている、コードは次のようになります行をチェックし、」イベントをチェックしてください。

private void cbShowSelected_CheckedChanged(object sender, EventArgs e) 
{ 
    if (cbShowSelected.Checked) 
     dtMembers.DefaultView.RowFilter = "Print = True"; 
    else 
     dtMembers.DefaultView.RowFilter = string.Empty; 
} 

、ユーザーがさまざまな行を刻み、その後のチェック時には、上記のコードは正常に動作します 『ショーは、これまでの』ので、すべての良い行をチェックします。大量の行をチェックする必要があるユーザーが2人いるので、ユーザビリティの観点から、検索テキストボックスにメンバーシップ番号を入力すると、datagridviewがそのメンバーシップ番号にフィルタされるようにコードを追加しました。また、ユーザーが+シンボルを入力し、フィルタビューに行が1つしかない場合は、その行をチェックします。このコードが正常にその行のチェックボックスをチェックしないが、私はそれから行くと確認した場合

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

OK、もう少しテストし、明確にする必要があります。 +記号を使用して行をチェックし、「選択したレコードを表示」にチェックを入れると、レコードは表示されません。手動で別のレコードを手動でチェックしてから「選択したレコードを表示」をチェックすると、両方のレコードが表示されます。 –

+0

チェックするには "== true"を追加する必要がありますか? – starko

+0

あなたのコメントstarkoのおかげで、私は試してみましたが、それは助けにはなりません。私は手動でセルをチェックするとき、まったく同じフィルタ構文が働くので気にしませんでした。簡単にするために、私は今、datagridview、テキストボックス(検索)、チェックボックス(チェックされた行を表示)だけを持つ新しいプロジェクトを作成し、コードを元に戻して残念ながら私はそれでも同じ問題があります。 –

答えて

0

私はこの問題を最終的に解決することができましたが、問題はDataGridViewがバインドされているDataTableの値ではなく、DataGridViewの値を設定していたことだと思います。だから今私は動作する代わりに、次のコードを使用しています:

BindingManagerBase bm=this.dgMembers.BindingContext[this.dgMembers.DataSource, this.dgMembers.DataMember]; 
DataRow dr = ((DataRowView)bm.Current).Row; 
dr["print"] = true 
関連する問題