2017-03-06 11 views
0

データテーブルを次のようにフィルタリングするにはどうすればよいですか?データテーブルをフィルタリングする方法

私は[cancelledOrders]と[allOrders]として2つのdatatableを持っていますが、両方のvb.netフォームには列名[OrderNo]があります。

私がしたいのは、[orderOo]列に[cancelledOrders]の[OrderNo]列の値と等しい値が含まれていないfilter [allOrders]データ表です。

文字列のリストを使用しようとしました。しかし、私は成功しませんでした。誰かが私を助けてくれますか?

おかげ

答えて

0

あなたの質問は、あなたが展示フィルタまたはデータ・フェッチフィルタが必要な場合については明らかではないので、私は後者を仮定します。あなたの[OrderNo]列が両方ともタイプIntegerであると仮定します。だからここに行く:このバージョンでは、非選択行非表示になります:

Function FilterCancelledOrders(allOrders As DataTable, cancelledOrders As DataTable) As DataRow 

    ' Let's use LInQ to collect all the numbers of cancelledOrders into an Array Of Integer 
    Dim CancelledOrderNos = cancelledOrders.Select.Select(
     Function(dr) dr.Field(Of Integer)("OrderNo")).ToArray 

    ' Now let's collect all dataRows from allOrders where OrderNo is contained in the Array of Integer we just got above: 
    Dim CancelledOrderRows = allOrders.Select.Where(
     Function(dr) CancelledOrderNos.Contains(dr.Field(Of Integer)("OrderNo"))).ToArray 

    ' If this is enough for your needs, now you have an Array of DataRow containing 
    ' all rows in [allOrders] whose [OrderNo] field info is contained in the corresponding 
    ' field of any row in [cancelledOrders] 
    Return CancelledOrderRows 
End Function 

EDIT

Sub FilterCancelledOrders(allOrdersView As DataGridView, cancelledOrders As DataTable, dgview as DataGridView) 

    ' so far, same as before, but type String 
    Dim CancelledOrderNos = cancelledOrders.Select.Select(
     Function(dr) dr.Field(Of String)("OrderNo")).ToArray 

    ' iterate through DataGridView's rows 
    For each dgvr as DataGridViewRow in dgview.Rows 

     ' set row visibility according to your criterium 
     dgvr.Visible = Not CancelledOrderNos.Contains(dgvr.Cells("OrderNo").Value) 

    Next 

    ' it's done! 

End Sub 

OR ELSEをあなたを濾過データテーブルを作成し、あなたのDataGridViewのデータソースとして設定することができます

Function GetPositiveOrdersDataTable(allOrders As DataTable, cancelledOrders As DataTable) As DataTable 

    Dim CancelledOrderNos = cancelledOrders.Select.Select(
     Function(dr) dr.Field(Of Integer)("OrderNo")).ToArray 

    ' Collect all dataRows from allOrders where OrderNo is NOT contained in the Array of Integer we just got above: 
    Dim positiveOrderRows = allOrders.Select.Where(
     Function(dr) Not CancelledOrderNos.Contains(dr.Field(Of Integer)("OrderNo"))).ToArray 

    ' create empty table with same structure as allOrders 
    Dim positiveOrders = allOrders.Clone() 

    ' populate it with orders that were not cancelled 
    For each dr in positiveOrderRows 
     positiveOrders.ImportRow(dr) 
    Next 

    Return positiveOrders 
End Function 
+0

最初にあなたを費やしてくれてありがとう貴重な時間。実際には、データテーブルは実行時にdatagridviewを満たすために使用されます。 DataView.RowFilterを使用してデータテーブルをフィルタリングするためのチェックボックスがあります。だから私は展覧会フィルターが必要だと思う。申し訳ありませんが、[OrderNo]列は両方ともStringであるとは言えません。あなたの答えをコーディングしてみましょう:) –

+0

編集を参照してください。 – VBobCat

+0

ありがとうございます@VBobCat。あなたの助けを借りて私は先に進むことができた再度、感謝します –

1

私はSQLクエリをフィルタリングします。それは次のようなものになります。

SELECT allOrdersを* EXISTS、NOT allOrders FROM(cancelledOrders.orderno = allOrders.orderno cancelledOrders SELECT * FROM)すべての

関連する問題