Microsoft KB Archive/816164

= How to bind a DataGrid control to an ArrayList of objects or structures by using Visual C++ .NET or Visual C++ 2005 =

Article ID: 816164

Article Last Modified on 5/13/2007

-

APPLIES TO


 * Microsoft Visual C++ 2005 Express Edition
 * Microsoft Visual C++ .NET 2003 Standard Edition

-







For a Microsoft Visual Basic .NET version of this article, see 316302.



For a Microsoft Visual C# .NET version of this article, see 316303.

IN THIS TASK

 * SUMMARY
 * Requirements
 * Design of the Class
 * Add Class Instances to an ArrayList
 * Bind the ArrayList to the DataGrid
 * Move Through the ArrayList
 * Step-by -Step Example
 * REFERENCES



SUMMARY
This step-by-step article describes how to bind an ArrayList class of objects to a DataGrid control. The example includes a Windows form with a DataGrid control to display object property values and includes four command buttons to browse the rows of the DataGrid control.

back to the top

Requirements
This article assumes that you are familiar with the following topics:
 * Visual C++ .NET or Visual C++ 2005 programming concepts

The following list outlines the recommended hardware, software, network infrastructure, and service packs that you need:
 * Microsoft Visual C++ .NET or Microsoft Visual C++ 2005

back to the top

Design of the Class
To bind a class to a control, the class must have property accessors. Any property that you bind must have a getter function and a setter function. You implement properties by using the getter function and the setter function, and you notify the compiler that these are property functions that use the __property keyword. The sample class that is used in this article has three members: __gc class Guitar { private: String *make; String *model; short year; public: Guitar(void); ~Guitar(void); Guitar(String *strMake, String *strModel, short shYear) {           make = strMake; model = strModel; year = shYear; }

__property String* get_Make {           return make; }       __property void set_Make(String* val) {           make = (val); }       __property String* get_Model {            return model; }       __property void set_Model(String* val) {           model = (val); }

__property short get_Year {            return year; }       __property void set_Year(short shValue) {           year = shValue; } }; back to the top

Add Class Instances to an ArrayList
To create instances and add them to the ArrayList class, follow these steps:

  Declare an ArrayList class as follows: private: ArrayList *arrayList;   In the FormLoad event handler, create instances of the class, and then add the instances to the ArrayList class as follows: //Create an ArrayList. arrayList = new ArrayList;

//Populate the array list. arrayList->Add(new guitar(S&quot;GibSon&quot;,S&quot;Les Paul&quot;,1958)); arrayList->Add(new guitar(S&quot;Fender&quot;,S&quot;Jazz Bass&quot;,1958)); arrayList->Add(new guitar(S&quot;Guild&quot;,S&quot;Bluesbird&quot;,1958)); 

back to the top

Bind the ArrayList to the DataGrid
After the ArrayList class is populated, set the DataSource property of the DataGrid control to the ArrayList class. The columns in the DataGrid control are populated based on the properties for which in-scope property accessors exist. // Bind the Array List to DataGrid. dataGrid1->DataSource = arrayList; back to the top

Move Through the ArrayList
You can use the CurrencyManager class to move through the ArrayList class. To do this, declare a variable for the CurrencyManager class as follows: private: CurrencyManager *currencyManager; Associate the CurrencyManager class with the BindingContext function of the control (in this case, the ArrayList). currencyManager = (CurrencyManager*)dataGrid1->BindingContext ->Item[arrayList]; The CurrencyManager class has a Position property that you can manipulate to iterate over the members of the ArrayList class. By adding to, or subtracting from, the current value of the Position function, you can move through the rows of the DataGrid control. //Move forward one element. currencyManager.Position++; //Move back one element. currencyManager.Position--; //Move to the beginning. currencyManager.Position = 0; //Move to the end. currencyManager.Position = arrayList.Count - 1; back to the top

Step-by-Step Example
 Start Microsoft Visual Studio .NET 2003 or Microsoft Visual Studio 2005. On the File menu, point to New, and then click Project. Click Visual C++ Projects under Project Types, and then click Windows Forms Application (.NET) under Templates.

Note In Visual Studio 2005, click Visual C++ under Project Types, and then click Windows Forms Application under Templates.</li> In the Name text box, type Q816164, and then click OK.</li> In Solution Explorer, switch to Class View. To do this, click Class View on the View menu.</li> Right-click Q816164, point to Add, and then click Add Class.</li> In the Add Class dialog box, click Generic C++ Class under Templates, and then click Open.

Note In Visual Studio 2005, click C++ Cass under Templates, and then click Add.</li>  In the Generic C++ Class Wizard, type Guitar in the Class name text box, and then click Finish. The Guitar class appears as follows:
 * 1) pragma once

class Guitar { public: Guitar(void); ~Guitar(void); }; Note In Visual Studio 2005, the code is as follows.
 * 1) pragma once

ref class Guitar { public: Guitar(void); }; To make the Guitar class a Managed Extensions for C++ class, add the __gc keyword before the Guitar class, as follows: __gc class Guitar { public: Guitar(void); ~Guitar(void); }; </li>  Replace the existing code in the Guitar.h file with the following code:
 * 1) pragma once

using namespace System; __gc class Guitar { private: String *make; String *model; short year; public: Guitar(void); ~Guitar(void); Guitar(String *strMake, String *strModel, short shYear) {           make = strMake; model = strModel; year = shYear; }

__property String* get_Make {           return make; }       __property void set_Make(String* val) {           make = (val); }       __property String* get_Model {            return model; }       __property void set_Model(String* val) {           model = (val); }

__property short get_Year {            return year; }       __property void set_Year(short shValue) {           year = shValue; } }; Note You must add the common language runtime support compiler option (/clr:oldSyntax) in Visual C++ 2005 to successfully compile the previous code sample. To add the common language runtime support compiler option in Visual C++ 2005, follow these steps:  Click Project, and then click  Properties.

Note  is a placeholder for the name of the project.</li> Expand Configuration Properties, and then click General.</li> Click to select Common Language Runtime Support, Old Syntax (/clr:oldSyntax) in the Common Language Runtime support project setting in the right pane, click Apply, and then click OK.</li></ol>

For more information about the common language runtime support compiler option, visit the following Microsoft Web site:

/clr (Common Language Runtime Compilation)

http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx

</li> Close the Guitar.h code window, and then switch to Form Designer.</li> Add a DataGrid control to Form1. Size the DataGrid control to fit four columns and three rows.</li> Add four Button controls to Form1, and then arrange the buttons horizontally.</li> Change the Text property of Button1 to Next.</li> Change the Text property of Button2 to Previous .</li> <li>Change the Text property of Button3 to First .</li> <li>Change the Text property of Button4 to Last .</li> <li> Open the Form1.h file, and add the following code at the beginning: <li> Add the following code to the Form1 class: private: System::Collections::ArrayList *arrayList; private: System::Windows::Forms::CurrencyManager *currencyManager; </li> <li>Switch to Form Designer, right-click form1, and then click Properties.</li> <li>Click the Events icon, and then double-click the Load event to add the Form1_Load event to your code.</li> <li> Paste the following code in the Form1_Load event: //Create an arraylist. arrayList = new ArrayList;
 * 1) include &quot;Guitar.h&quot; </li>

arrayList->Add(new Guitar(S&quot;GibSon&quot;,S&quot;Les Paul&quot;,1958)); arrayList->Add(new Guitar(S&quot;Fender&quot;,S&quot;Jazz Bass&quot;,1958)); arrayList->Add(new Guitar(S&quot;Guild&quot;,S&quot;Bluesbird&quot;,1958));

currencyManager = dynamic_cast <CurrencyManager*> (dataGrid1->BindingContext->Item[arrayList]); // Bind the Array List to DataGrid. dataGrid1->DataSource = arrayList; </li> <li>Switch to Form Designer.</li> <li> Double-click Next, and then add the following code to the button1_Click event: //Move to the next position. currencyManager->Position++; </li> <li> Double-click Previous, and then add the following code to the button2_Click event: //Move to the previous position. currencyManager->Position--; </li> <li> Double-click First, and then add the following code to the button3_Click event: //Move to the first position. currencyManager->Position =0; </li> <li> Double-click Last, and then add the following code to the button4_Click event: //Move to the last position. currencyManager->Position = currencyManager->Count -1; </li> <li>Build, and then run the project.</li> <li>Click the command buttons to move through the rows of the DataGrid control. Notice that you can edit the values of the objects, if you need to.</li></ol>

back to the top

<div class="references_section">