<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Generics</title>
        <link>http://onteorasoftware.net/category/18.aspx</link>
        <description>Generics</description>
        <language>en-US</language>
        <copyright>Ken Tucker</copyright>
        <generator>Subtext Version 2.1.2.2</generator>
        <item>
            <title>Predicates</title>
            <link>http://blog.onteorasoftware.net/archive/2007/09/16/predicates.aspx</link>
            <description>&lt;h3 align="center"&gt;Predicates&lt;/h3&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;
I recently read an article in the MSDN magazine about &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/09/AdvancedBasics/"&gt;Predicates and Actions&lt;/a&gt; written by Ken Getz. I was thinking that predicates will make it easy to create a master details datagridview for a business object. This example creates 2 classes Customers and Orders. I used the Northwind database to fill a list of customers and a list of orders. I bound one grid to a binding source who's datasource is the list of customers. In the binding sources position changed event I use the list of orders findall method to show all the orders for a customer. 
&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;
The classes 
&lt;/p&gt;
&lt;p&gt;
Public Class Orders&lt;br /&gt;
    Private mintOrderID As Integer&lt;br /&gt;
    Public Property OrderID() As Integer&lt;br /&gt;
        Get&lt;br /&gt;
            Return mintOrderID&lt;br /&gt;
        End Get&lt;br /&gt;
        Set(ByVal value As Integer)&lt;br /&gt;
            mintOrderID = value&lt;br /&gt;
        End Set&lt;br /&gt;
    End Property 
&lt;/p&gt;
&lt;p&gt;
    Private mdtOrderDate As Date&lt;br /&gt;
    Public Property OrderDate() As Date&lt;br /&gt;
        Get&lt;br /&gt;
            Return mdtOrderDate&lt;br /&gt;
        End Get&lt;br /&gt;
        Set(ByVal value As Date)&lt;br /&gt;
            mdtOrderDate = value&lt;br /&gt;
        End Set&lt;br /&gt;
    End Property 
&lt;/p&gt;
&lt;p&gt;
    Private mstrCustID As String&lt;br /&gt;
    Public Property CustomerID() As String&lt;br /&gt;
        Get&lt;br /&gt;
            Return mstrCustID&lt;br /&gt;
        End Get&lt;br /&gt;
        Set(ByVal value As String)&lt;br /&gt;
            mstrCustID = value&lt;br /&gt;
        End Set&lt;br /&gt;
    End Property 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
End Class 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Public Class Customers&lt;br /&gt;
    Private mstrCustID As String&lt;br /&gt;
    Public Property CustomerID() As String&lt;br /&gt;
        Get&lt;br /&gt;
            Return mstrCustID&lt;br /&gt;
        End Get&lt;br /&gt;
        Set(ByVal value As String)&lt;br /&gt;
            mstrCustID = value&lt;br /&gt;
        End Set&lt;br /&gt;
    End Property 
&lt;/p&gt;
&lt;p&gt;
    Private mstrCompanyName As String&lt;br /&gt;
    Public Property CompanyName() As String&lt;br /&gt;
        Get&lt;br /&gt;
            Return mstrCompanyName&lt;br /&gt;
        End Get&lt;br /&gt;
        Set(ByVal value As String)&lt;br /&gt;
            mstrCompanyName = value&lt;br /&gt;
        End Set&lt;br /&gt;
    End Property 
&lt;/p&gt;
&lt;p&gt;
    Private mstrContactName As String&lt;br /&gt;
    Public Property ContactName() As String&lt;br /&gt;
        Get&lt;br /&gt;
            Return mstrContactName&lt;br /&gt;
        End Get&lt;br /&gt;
        Set(ByVal value As String)&lt;br /&gt;
            mstrContactName = value&lt;br /&gt;
        End Set&lt;br /&gt;
    End Property 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
End Class 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;br /&gt;
  
&lt;/p&gt;
&lt;p&gt;
The Main code 
&lt;/p&gt;
&lt;p&gt;
Imports System.Data.SqlClient 
&lt;/p&gt;
&lt;p&gt;
Public Class Form1&lt;br /&gt;
    Dim lstCustomers As New List(Of Customers)&lt;br /&gt;
    Dim lstOrders As New List(Of Orders)&lt;br /&gt;
    Dim WithEvents bsCustomers As New BindingSource&lt;br /&gt;
    Private CustId As String = "" 
&lt;/p&gt;
&lt;p&gt;
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;
        FillCustomers()&lt;br /&gt;
        FillOrders()&lt;br /&gt;
        bsCustomers.DataSource = lstCustomers&lt;br /&gt;
        DataGridView1.DataSource = bsCustomers&lt;br /&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
    Private Sub FillCustomers()&lt;br /&gt;
        Dim conn As SqlConnection&lt;br /&gt;
        Dim strConn As String&lt;br /&gt;
        Dim dr As SqlDataReader&lt;br /&gt;
        Dim cmd As SqlCommand&lt;br /&gt;
        Dim strSql As String 
&lt;/p&gt;
&lt;p&gt;
        strConn = "Server = .;Database = NorthWind; Integrated Security = SSPI;" 
&lt;/p&gt;
&lt;p&gt;
        conn = New SqlConnection(strConn) 
&lt;/p&gt;
&lt;p&gt;
        conn.Open() 
&lt;/p&gt;
&lt;p&gt;
        strSql = "Select CustomerID, CompanyName, ContactName from Customers" 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
        cmd = New SqlCommand(strSql, conn) 
&lt;/p&gt;
&lt;p&gt;
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 
&lt;/p&gt;
&lt;p&gt;
        Do While dr.Read&lt;br /&gt;
            Dim cls As New Customers&lt;br /&gt;
            With cls&lt;br /&gt;
                .CompanyName = dr("CompanyName").ToString&lt;br /&gt;
                .ContactName = dr("ContactName").ToString&lt;br /&gt;
                .CustomerID = dr("CustomerID").ToString&lt;br /&gt;
            End With&lt;br /&gt;
            lstCustomers.Add(cls)&lt;br /&gt;
        Loop&lt;br /&gt;
        conn.Close() 
&lt;/p&gt;
&lt;p&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
    Private Sub FillOrders()&lt;br /&gt;
        Dim conn As SqlConnection&lt;br /&gt;
        Dim strConn As String&lt;br /&gt;
        Dim dr As SqlDataReader&lt;br /&gt;
        Dim cmd As SqlCommand&lt;br /&gt;
        Dim strSql As String 
&lt;/p&gt;
&lt;p&gt;
        strConn = "Server = .;Database = NorthWind; Integrated Security = SSPI;" 
&lt;/p&gt;
&lt;p&gt;
        conn = New SqlConnection(strConn) 
&lt;/p&gt;
&lt;p&gt;
        conn.Open() 
&lt;/p&gt;
&lt;p&gt;
        strSql = "Select CustomerID, OrderID, OrderDate from Orders" 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
        cmd = New SqlCommand(strSql, conn) 
&lt;/p&gt;
&lt;p&gt;
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 
&lt;/p&gt;
&lt;p&gt;
        Do While dr.Read&lt;br /&gt;
            Dim cls As New Orders&lt;br /&gt;
            With cls&lt;br /&gt;
                .OrderID = dr.GetInt32(1)&lt;br /&gt;
                .OrderDate = dr.GetDateTime(2)&lt;br /&gt;
                .CustomerID = dr("CustomerID").ToString&lt;br /&gt;
            End With&lt;br /&gt;
            lstOrders.Add(cls)&lt;br /&gt;
        Loop&lt;br /&gt;
        conn.Close() 
&lt;/p&gt;
&lt;p&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
    Private Function FindCustomerOrders(ByVal Ordr As Orders) As Boolean&lt;br /&gt;
        Return Ordr.CustomerID = CustId&lt;br /&gt;
    End Function 
&lt;/p&gt;
&lt;p&gt;
    Private Sub bsCustomers_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles bsCustomers.PositionChanged&lt;br /&gt;
        Dim cust As Customers 
&lt;/p&gt;
&lt;p&gt;
        cust = TryCast(bsCustomers.Current, Customers)&lt;br /&gt;
        If Not cust Is Nothing Then&lt;br /&gt;
            CustId = cust.CustomerID&lt;br /&gt;
            DataGridView2.DataSource = lstOrders.FindAll(AddressOf FindCustomerOrders)&lt;br /&gt;
        End If&lt;br /&gt;
    End Sub&lt;br /&gt;
End Class 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;img src="http://blog.onteorasoftware.net/aggbug/98.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ken Tucker</dc:creator>
            <guid>http://blog.onteorasoftware.net/archive/2007/09/16/predicates.aspx</guid>
            <pubDate>Sun, 16 Sep 2007 18:52:58 GMT</pubDate>
            <wfw:comment>http://blog.onteorasoftware.net/comments/98.aspx</wfw:comment>
            <comments>http://blog.onteorasoftware.net/archive/2007/09/16/predicates.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.onteorasoftware.net/comments/commentRss/98.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>