2016-07-19 13 views
4

Winformsに2つのDataGridViewsがあります。 DataGrid1は、完了する必要があるジョブの一覧を含むテーブルに接続されています。誰かが仕事を完了すると、完了した別のテーブルに入力され、DataGrid2に接続されます。別のDataGridViewの行に基づいてBindingSourceをフィルタリングします。

DataGrid1のバインディングソースをフィルタリングして、ジョブがDataGrid2で完了したときにDataGrid1から除外されるようにする必要があります。私が使用している現在のコードは、DataGrid2の最後のエントリでバインディングソースのみをフィルタリングし、すべてのエントリでフィルタリングする必要があります。

DataGrid2のa列のすべての値に基づいて、DataGrid1に対してBindingSourc eをフィルタリングするにはどうすればよいですか?ここ

foreach (DataGridViewRow row in dataGrid2.Rows) 
{ 
    DataGrid1BindingSource.Filter = 
     string.Format("ColumnName <> '{0}'", row.Cells[1].Value); 
} 

データテーブル内のすべてのジョブ、不完全なジョブと完了したジョブが含まれている第2のグリッドが含まれ、最初のグリッドの一例です。不完全グリッドに表示されなければならないジョブ、完了したジョブグリッドではないこれらのジョブです:あなたはどの検出するboolフィールドか何かを持っていない場合

__________  ____________  ___________ 
| All Jobs |  | Incomplete |  | Completed | 
|――――――――――|  |――――――――――――|  |―――――――――――| 
| JobTitle |  | JobTitle |  | JobTitle | 
|――――――――――|  |――――――――――――|  |―――――――――――| 
| Job 1 |  | Job 1  |  | Job 3  | 
| Job 2 |  | Job 2  |  | Job 4  | 
| Job 3 |  |   |  |   | 
| Job 4 |  |   |  |   | 
‾‾‾‾‾‾‾‾‾‾  ‾‾‾‾‾‾‾‾‾‾‾‾  ‾‾‾‾‾‾‾‾‾‾‾ 
+0

を? WinForms? WebForms? WPF? Silverlight? ASP.NET MVC? –

+0

私はWinformsを使用しています。 –

+0

@ChrisSongerあなたが何を求めているのかは不明です。質問について言い換えて、もう少し詳しく説明し、grid1とgrid2の例を初期状態で示し、何がフィルタの結果になるかを述べてください。 –

答えて

3

答えを読む前に、あなたが知っておくべきこと仕事は完了していますが、それは良いデザインではありません。 1つのジョブリストが必要です。 boolフィールドに基づいて、不完全なジョブを最初のグリッドに表示し、完了したジョブを2番目のグリッドに表示する必要があります。その後、フィルタは単にCompleted = trueCompleted = falseになります。

とにかく、フィルタ式にはINを使用できます。たとえば"Column1 NOT IN (1,2,3)"のためので、私はidを想定し、上記の例では

var ids = this.dataGridView2.Rows.Cast<DataGridViewRow>() 
       .Where(r => !r.IsNewRow) 
       .Select(r => r.Cells[0].Value.ToString()); 
bs1.Filter = string.Format("Column1 NOT IN ({0})", string.Join(",", ids)); 

intされているフィルターになります。これは、フィルタをこのように作成し、その後、あなたはフィルタで使用する値のリストを作成するだけで十分です。文字列IDの場合、フィルタは"Column1 NOT IN ('a','b','c')"になります。ですから、以下のようなSELECTステートメントを変更することができます。

.Select(r => string.Format("'{0}'",r.Cells[0].Value.ToString())); 
+1

私は実際に2つのテーブルをお互いに比較しようとしています.Grid1にはジョブのリストがあり、Grid2には完了したジョブのリストがあり、それぞれに独自のバインディングソースがあります。私は、ジョブが完了したジョブGrid2に入力されるとGrid1のジョブリストからフィルタリングされるようにしようとしています –

+0

値の注目リストがグリッド2から作成され、次にグリッド1に割り当てられます。グリッド2にある行はグリッド1に表示されず、他の行だけがグリッド1に表示されます。 –

+0

構文エラー: 'JobTitle'演算子の後にオペランドがありません。仕事のタイトルにはスペースがあります。私は他のアプリケーションのために完全な真偽フィールドを含むデザインを使用しました。私がここでそれを使用していない理由は、完了する必要があるジョブのリストは変わらないということです。ジョブを含むリストの行数がゼロになると、フィルターは削除され、ユーザーは完全リストで再度開始します。 –

0

このコードは非常に醜いですが、それはあなたに何をすべきかのヒントを与える必要があります。どのような技術

var colname = YOURGRIDTOFILTER.Columns[INDEXOFCOLUMNTOFILTER].HeaderText; 
      var filterString = colname+" <> "; 
      foreach (DataGridViewRow row in dataGrid2.Rows) 
      { 
       filterString += "'" + row.Cells[1].Value + "' OR "+colname+" <> "; 
      } 
      filterString = filterString.Substring(0, filterString.LastIndexOf("OR")); 
関連する問題