How To Display Parent and Child Records in a Windows Forms DataGrid by Using Visual C# .NET (308484)



The information in this article applies to:

  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET (included with the .NET Framework 1.1)
  • Microsoft Visual C# .NET (2002)
  • Microsoft Visual C# .NET (2003)

This article was previously published under Q308484
For a Microsoft Visual Basic .NET version of this article, see 308052.

This article refers to the following Microsoft .NET Framework Class Library namespace:
  • System.Data.SqlClient

IN THIS TASK

SUMMARY

This article describes how to create a Windows form that displays a parent (or master) record and all of the related child (or detail) records by using the Northwind Customers and Orders tables. This article also describes the CurrencyManager object and its purpose.

In this article, the parent record information appears in TextBox controls, and the child record information appears in a DataGrid control. The project that you create in this article also contains Button controls so that you can browse through the records.

back to the top

Requirements

The following list outlines the recommended hardware, software, network infrastructure, and service packs that you need:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server, or Windows NT 4.0 Server
  • Microsoft SQL Server version 7.0 or 2000, or Microsoft Data Engine (MSDE) with the Northwind sample database installed
  • Microsoft Visual Studio .NET
back to the top

Understanding the CurrencyManager

It is important that you understand the function of the CurrencyManager object to help you follow the sample in this article. Any data source that you bind to in a Windows Forms control contains an associated CurrencyManager object. The CurrencyManager object monitors the position and otherwise supervises bindings to that data source. The form contains a CurrencyManager object for each discrete data source to which you are binding. If all of the controls on the form bind to a single source (for example, if several TextBox controls are bound to the same data table), they share the same CurrencyManager. When the controls on the form are bound to different sources, the form contains multiple CurrencyManager objects, each of which tracks which record or data element the controls are using.

back to the top

Create the Project

This section describes how to create the project that demonstrates this functionality.
  1. Start Visual Studio .NET, and create a new Visual C# Windows Application project.
  2. Add three TextBox controls, five Button controls, and one DataGrid control to the default form.
  3. Change the Text properties of the Button controls to Fill, First, Next, Previous, and Last.
  4. Switch to Code view, and add the following statement to the top of the Code window:
    using System.Data.SqlClient;
    					
  5. Add the following member variable to the Form1 class after the private statements:
    CurrencyManager cm;
    					
  6. Switch to Form view, and double-click Fill. Add the following code to the Click event:
    {
    // Get the data.
    SqlConnection con = new SqlConnection("server=<YourServer>;uid=<your_user_id>;
                                           pwd=<your_password>;database=northwind");
    SqlDataAdapter daCust = new SqlDataAdapter("Select * from Customers", con);
    SqlDataAdapter daOrders = new SqlDataAdapter("Select * from Orders",con);
    DataSet ds=new DataSet();
    daCust.Fill(ds,"Cust");
    daOrders.Fill(ds,"Orders");
    ds.Relations.Add("CustOrd",ds.Tables["Cust"].Columns["CustomerID"],
    ds.Tables["Orders"].Columns["CustomerID"]);
    // 
    //Bind the controls.
    // 
    textBox1.DataBindings.Add("Text", ds.Tables["Cust"],"CustomerID");
    textBox2.DataBindings.Add("Text", ds.Tables["Cust"],"CompanyName");
    textBox3.DataBindings.Add("Text", ds.Tables["Cust"],"ContactName");
    dataGrid1.DataSource=ds.Tables["Cust"];
    dataGrid1.DataMember="CustOrd";
    // 
    //Initialize the CurrencyManager.
    // 
    cm=(CurrencyManager)this.BindingContext[ds.Tables["Cust"]];
    }
    					
  7. Modify the connection string as appropriate for your environment.
  8. Double-click First, and add the following code to the Click event:
    {
    if((cm!=null)&(cm.Count>0))
    cm.Position=0;
    }
    					
  9. Double-click Next, and add the following code to the Click event:
    {
    if((cm!=null) &(cm.Count>0)&(cm.Position<cm.Count-1))
    cm.Position +=1;
    
    }
  10. Double-click Previous, and add the following code to the Click event:
    {
    if((cm!=null)&(cm.Count>0)&(cm.Position>0))
    cm.Position -=1;
    }
    					
  11. Double-click Last, and add the following code to the Click
    {
    if((cm!=null)& (cm.Count>0))
    cm.Position=cm.Count;
    
    }
back to the top

Test the Application

  1. Press the F5 key to compile and run the application. Note that the form is initially empty.
  2. Click Fill to load and bind the data, and use the navigation buttons to move through the data.
back to the top

REFERENCES

For more information about the CurrencyManager object, refer to the Visual Studio .NET Help documentation.

back to the top

Modification Type:MinorLast Reviewed:7/15/2004
Keywords:kbHOWTOmaster KB308484 kbAudDeveloper