2017-03-06 9 views
0

Wie kann ich eine Datentabelle wie folgt filtern?So filtern Sie die Datentabelle

Ich habe zwei Datentabellen als [cancelledOrders] und [allOrders] n mein vb.net Form beide der hat einen Spaltennamen [OrderNo].

Was ich tun möchte, ist die Datentabelle [allOrders] zu filtern, wobei die Spalte [OrderNo] keinen Wert enthält, der den Werten in der [OrderNo] -Spalte von [cancelledOrders] entspricht.

Ich habe versucht, die Liste der Zeichenfolge zu verwenden. Aber ich war nicht erfolgreich. Könnte mir bitte jemand helfen?

Dank

Antwort

0

Ihre Frage ist etwa nicht klar, ob Sie eine Ausstellung Filter oder ein Datenabruf Filter benötigen, also werde ich das letztere annehmen. Ich gehe davon aus, dass Ihre [OrderNo] Spalten beide vom Typ Integer sind. Also hier geht:

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: Diese Version nicht ausgewählten Zeilen versteckt:

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 

ODER SONST Sie können eine Datentabelle gefiltert erstellen und legen Sie es als Datagridview die Datenquelle:

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

zunächst einmal vielen Dank für Ihre Ausgaben wertvolle Zeit. Tatsächlich wird diese Datentabelle verwendet, um Datagridview zur Laufzeit zu füllen. Ich habe einige Kontrollkästchen, um die Datentabelle mit DataView.RowFilter zu filtern. also schätze ich brauche einen Ausstellungsfilter. Entschuldigung, ich konnte nicht erwähnen, dass beide [OrderNo] Spalten String sind. lass mich versuchen, mit deiner antwort zu codieren :) –

+0

Siehe edit. – VBobCat

+0

Vielen Dank @VBobCat. Mit Ihrer Hilfe könnte ich weitermachen. Danke noch einmal –

1

Ich würde in der SQL-Abfrage filtern. Es wird in etwa so aussehen:.

SELECT * FROM allOrders allOrders WHERE NOT EXISTS (SELECT * FROM cancelledOrders WHERE cancelledOrders.orderno = allOrders.orderno)

Verwandte Themen