How to: Bind a Windows Forms Control to a Factory Object
When you are building controls that interact with data, you will sometimes find it necessary to bind a control to an object or method that generates other objects. Such an object or method is called a factory. Your data source might be, for example, the return value from a method call, instead of an object in memory or a type. You can bind a control to this kind of data source as long as the source returns a collection.
You can easily bind a control to a factory object by using the BindingSource control.
The following example demonstrates how to bind a DataGridView control to a factory method by using a BindingSource control. The factory method is named GetOrdersByCustomerId, and it returns all the orders for a given customer in the Northwind database.
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Common; using System.Diagnostics; using System.Drawing; using System.Data.SqlClient; using System.Windows.Forms; // This form demonstrates using a BindingSource to bind to a factory // object. public class Form1 : System.Windows.Forms.Form { // This is the TextBox for entering CustomerID values. private TextBox customerIdTextBox = new TextBox(); // This is the DataGridView that displays orders for the // specified customer. private DataGridView customersDataGridView = new DataGridView(); // This is the BindingSource for binding the database query // result set to the DataGridView. private BindingSource ordersBindingSource = new BindingSource(); public Form1() { // Set up the CustomerID TextBox. this.customerIdTextBox.Location = new Point(100, 200); this.customerIdTextBox.Size = new Size(500, 30); this.customerIdTextBox.Text = "Enter a valid Northwind CustomerID, for example: ALFKI," + " then RETURN or click outside the TextBox"; this.customerIdTextBox.Leave += new EventHandler(customerIdTextBox_Leave); this.customerIdTextBox.KeyDown += new KeyEventHandler(customerIdTextBox_KeyDown); this.Controls.Add(this.customerIdTextBox); // Set up the DataGridView. customersDataGridView.Dock = DockStyle.Top; this.Controls.Add(customersDataGridView); // Set up the form. this.Size = new Size(800, 500); this.Load += new EventHandler(Form1_Load); } // This event handler binds the BindingSource to the DataGridView // control's DataSource property. private void Form1_Load( System.Object sender, System.EventArgs e) { // Attach the BindingSource to the DataGridView. this.customersDataGridView.DataSource = this.ordersBindingSource; } // This is a static factory method. It queries the Northwind // database for the orders belonging to the specified // customer and returns an IEnumerable. public static IEnumerable GetOrdersByCustomerId(string id) { // Open a connection to the database. string connectString = "Integrated Security=SSPI;" + "Persist Security Info=False;Initial Catalog=Northwind;" + "Data Source= localhost"; SqlConnection connection = new SqlConnection(); connection.ConnectionString = connectString; connection.Open(); // Execute the query. string queryString = String.Format("Select * From Orders where CustomerID = '{0}'", id); SqlCommand command = new SqlCommand(queryString, connection); SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); return reader; } // These event handlers are called when the user tabs or clicks // out of the customerIdTextBox or hits the return key. // The database is then queried with the CustomerID // in the customerIdTextBox.Text property. void customerIdTextBox_Leave(object sender, EventArgs e) { // Attach the data source to the BindingSource control. this.ordersBindingSource.DataSource = GetOrdersByCustomerId(this.customerIdTextBox.Text); } void customerIdTextBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Return) { // Attach the data source to the BindingSource control. this.ordersBindingSource.DataSource = GetOrdersByCustomerId(this.customerIdTextBox.Text); } } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } }
This example requires:
References to the System, System.Data, System.Drawing and System.Windows.Forms assemblies.
For information about building this example from the command line for Visual Basic or Visual C#, see Building from the Command Line (Visual Basic) or Command-line Building With csc.exe. You can also build this example in Visual Studio by pasting the code into a new project. How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio