DataGridViewComboBoxColumn Class
Represents a column of DataGridViewComboBoxCell objects.
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)
The DataGridViewComboBoxColumn class is a specialized type of DataGridViewColumn used to logically host cells that enable users to select values from a list of choices. A DataGridViewComboBoxColumn has an associated DataGridViewComboBoxCell in every DataGridViewRow that intersects it.
You can populate the cells manually by setting their Value properties. Alternatively, you can bind the column to the data source indicated by the DataGridView.DataSource property. If the DataGridView is bound to a database table, set the column DataPropertyName property to the name of a column in the table. If the DataGridView is bound to a collection of objects, set the DataPropertyName property to the name of an object property.
You can populate the column drop-down list manually by adding values to the Items collection. Alternatively, you can bind the drop-down list to its own data source by setting the column DataSource property. If the values are objects in a collection or records in a database table, you must also set the DisplayMember and ValueMember properties. The DisplayMember property indicates which object property or database column provides the values that are displayed in the drop-down list. The ValueMember property indicates which object property or database column is used to set the cell Value property.
One typical scenario is to bind the DataGridView control to a parent database table and bind the drop-down list to a related child table. For example, you might bind the DataGridView control to an Orders table that contains a ProductID column and set the column DataSource property to a Products table that contains ProductID and ProductName columns. In this case, you would set the column DataPropertyName property to "ProductID" to populate its cell values from the Orders.ProductID column. However, to display the actual product names in the cells and the drop-down list, you would map these values to the Products table by setting the ValueMember property to "ProductID" and the DisplayMember property to "ProductName".
The drop-down list values (or the values indicated by the ValueMember property) must include the actual cell values or the DataGridView control will throw an exception.
Setting the column DataSource, DisplayMember, and ValueMember properties automatically sets the corresponding properties of all cells in the column including the CellTemplate. To override these property values for specific cells, set the column property first, and then set the cell properties.
Unlike the ComboBox control, the DataGridViewComboBoxCell does not have SelectedIndex and SelectedValue properties. Instead, selecting a value from a drop-down list sets the cell Value property.
The default sort mode for this column type is NotSortable.
Notes to Inheritors:When you derive from DataGridViewComboBoxColumn and add new properties to the derived class, be sure to override the Clone method to copy the new properties during cloning operations. You should also call the base class's Clone method so that the properties of the base class are copied to the new cell.
The following code example demonstrates how to use a DataGridViewComboBoxColumn to aid in entering data into the TitleOfCourtesy column.
Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Windows.Forms Imports System.Collections.Generic Imports System.Drawing Public Class Employees Inherits System.Windows.Forms.Form Private WithEvents DataGridView1 As New DataGridView Private WithEvents DataGridView2 As New DataGridView <STAThreadAttribute()> _ Public Shared Sub Main() Try Application.EnableVisualStyles() Application.Run(New Employees()) Catch e As Exception MessageBox.Show(e.Message & e.StackTrace) End Try End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Try SetUpForm() SetUpDataGridView1() SetUpDataGridView2() Catch ex As SqlException MessageBox.Show("The connection string <" _ & connectionString _ & "> failed to connect. Modify it to connect to " _ & "a Northwind database accessible to your system.", _ "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Application.Exit() End Try End Sub Private Sub SetUpForm() Size = New Size(800, 600) Dim flowLayout As New FlowLayoutPanel() flowLayout.FlowDirection = FlowDirection.TopDown flowLayout.Dock = DockStyle.Fill Controls.Add(flowLayout) Text = "DataGridView columns demo" flowLayout.Controls.Add(DataGridView1) flowLayout.Controls.Add(DataGridView2) End Sub Private Sub SetUpDataGridView2() DataGridView2.Dock = DockStyle.Bottom DataGridView2.TopLeftHeaderCell.Value = "Sales Details" DataGridView2.RowHeadersWidthSizeMode = _ DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders End Sub Private Sub SetUpDataGridView1() ' Virtual mode is turned on so that the ' unbound DataGridViewCheckBoxColumn will ' keep its state when the bound columns are ' sorted. DataGridView1.VirtualMode = True DataGridView1.AutoSize = True DataGridView1.DataSource = _ Populate("SELECT * FROM Employees") DataGridView1.TopLeftHeaderCell.Value = "Employees" DataGridView1.RowHeadersWidthSizeMode = _ DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders DataGridView1.ColumnHeadersHeightSizeMode = _ DataGridViewColumnHeadersHeightSizeMode.AutoSize DataGridView1.AutoSizeColumnsMode = _ DataGridViewAutoSizeColumnsMode.AllCells DataGridView1.AllowUserToAddRows = False DataGridView1.AllowUserToDeleteRows = False ' The below autogenerated column is removed so ' a DataGridViewComboboxColumn could be used instead. DataGridView1.Columns.Remove( _ ColumnName.TitleOfCourtesy.ToString()) DataGridView1.Columns.Remove(ColumnName.ReportsTo.ToString()) AddLinkColumn() AddComboBoxColumns() AddButtonColumn() AddOutOfOfficeColumn() End Sub Private Sub AddComboBoxColumns() Dim comboboxColumn As DataGridViewComboBoxColumn comboboxColumn = CreateComboBoxColumn() SetAlternateChoicesUsingDataSource(comboboxColumn) comboboxColumn.HeaderText = _ "TitleOfCourtesy (via DataSource property)" DataGridView1.Columns.Insert(0, comboboxColumn) comboboxColumn = CreateComboBoxColumn() SetAlternateChoicesUsingItems(comboboxColumn) comboboxColumn.HeaderText = _ "TitleOfCourtesy (via Items property)" ' Tack this example column onto the end. DataGridView1.Columns.Add(comboboxColumn) End Sub Private Sub AddLinkColumn() Dim links As New DataGridViewLinkColumn() With links .UseColumnTextForLinkValue = True .HeaderText = ColumnName.ReportsTo.ToString() .DataPropertyName = ColumnName.ReportsTo.ToString() .ActiveLinkColor = Color.White .LinkBehavior = LinkBehavior.SystemDefault .LinkColor = Color.Blue .TrackVisitedState = True .VisitedLinkColor = Color.YellowGreen End With DataGridView1.Columns.Add(links) End Sub Private Shared Sub SetAlternateChoicesUsingItems( _ ByVal comboboxColumn As DataGridViewComboBoxColumn) comboboxColumn.Items.AddRange("Mr.", "Ms.", "Mrs.", "Dr.") End Sub Private Function CreateComboBoxColumn() _ As DataGridViewComboBoxColumn Dim column As New DataGridViewComboBoxColumn() With column .DataPropertyName = ColumnName.TitleOfCourtesy.ToString() .HeaderText = ColumnName.TitleOfCourtesy.ToString() .DropDownWidth = 160 .Width = 90 .MaxDropDownItems = 3 .FlatStyle = FlatStyle.Flat End With Return column End Function Private Sub SetAlternateChoicesUsingDataSource( _ ByVal comboboxColumn As DataGridViewComboBoxColumn) With comboboxColumn .DataSource = RetrieveAlternativeTitles() .ValueMember = ColumnName.TitleOfCourtesy.ToString() .DisplayMember = .ValueMember End With End Sub Private Function RetrieveAlternativeTitles() As DataTable Return Populate( _ "SELECT distinct TitleOfCourtesy FROM Employees") End Function Private connectionString As String = _ "Integrated Security=SSPI;Persist Security Info=False;" _ & "Initial Catalog=Northwind;Data Source=localhost" Private Function Populate(ByVal sqlCommand As String) As DataTable Dim northwindConnection As New SqlConnection(connectionString) northwindConnection.Open() Dim command As New SqlCommand(sqlCommand, _ northwindConnection) Dim adapter As New SqlDataAdapter() adapter.SelectCommand = command Dim table As New DataTable() table.Locale = System.Globalization.CultureInfo.InvariantCulture adapter.Fill(table) Return table End Function ' Using an enum provides some abstraction between column index ' and column name along with compile time checking, and gives ' a handy place to store the column names. Enum ColumnName EmployeeId LastName FirstName Title TitleOfCourtesy BirthDate HireDate Address City Region PostalCode Country HomePhone Extension Photo Notes ReportsTo PhotoPath OutOfOffice End Enum Private Sub AddButtonColumn() Dim buttons As New DataGridViewButtonColumn() With buttons .HeaderText = "Sales" .Text = "Sales" .UseColumnTextForButtonValue = True .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells .FlatStyle = FlatStyle.Standard .CellTemplate.Style.BackColor = Color.Honeydew .DisplayIndex = 0 End With DataGridView1.Columns.Add(buttons) End Sub Private Sub AddOutOfOfficeColumn() Dim column As New DataGridViewCheckBoxColumn() With column .HeaderText = ColumnName.OutOfOffice.ToString() .Name = ColumnName.OutOfOffice.ToString() .AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells .FlatStyle = FlatStyle.Standard .CellTemplate = New DataGridViewCheckBoxCell() .CellTemplate.Style.BackColor = Color.Beige End With DataGridView1.Columns.Insert(0, column) End Sub Private Sub PopulateSales( _ ByVal buttonClick As DataGridViewCellEventArgs) Dim employeeId As String = _ DataGridView1.Rows(buttonClick.RowIndex). _ Cells(ColumnName.EmployeeId.ToString()).Value().ToString() DataGridView2.DataSource = Populate( _ "SELECT * FROM Orders WHERE EmployeeId = " & employeeId) End Sub #Region "SQL Error handling" Private Sub DataGridView1_DataError(ByVal sender As Object, _ ByVal e As DataGridViewDataErrorEventArgs) _ Handles DataGridView1.DataError MessageBox.Show("Error happened " _ & e.Context.ToString()) If (e.Context = DataGridViewDataErrorContexts.Commit) _ Then MessageBox.Show("Commit error") End If If (e.Context = DataGridViewDataErrorContexts _ .CurrentCellChange) Then MessageBox.Show("Cell change") End If If (e.Context = DataGridViewDataErrorContexts.Parsing) _ Then MessageBox.Show("parsing error") End If If (e.Context = _ DataGridViewDataErrorContexts.LeaveControl) Then MessageBox.Show("leave control error") End If If (TypeOf (e.Exception) Is ConstraintException) Then Dim view As DataGridView = CType(sender, DataGridView) view.Rows(e.RowIndex).ErrorText = "an error" view.Rows(e.RowIndex).Cells(e.ColumnIndex) _ .ErrorText = "an error" e.ThrowException = False End If End Sub #End Region Private Sub DataGridView1_CellContentClick(ByVal sender As Object, _ ByVal e As DataGridViewCellEventArgs) _ Handles DataGridView1.CellContentClick If IsANonHeaderLinkCell(e) Then MoveToLinked(e) ElseIf IsANonHeaderButtonCell(e) Then PopulateSales(e) End If End Sub Private Sub MoveToLinked(ByVal e As DataGridViewCellEventArgs) Dim employeeId As String Dim value As Object = DataGridView1.Rows(e.RowIndex). _ Cells(e.ColumnIndex).Value If value.GetType Is GetType(DBNull) Then Return employeeId = CType(value, String) Dim boss As DataGridViewCell = _ RetrieveSuperiorsLastNameCell(employeeId) If boss IsNot Nothing Then DataGridView1.CurrentCell = boss End If End Sub Private Function IsANonHeaderLinkCell(ByVal cellEvent As _ DataGridViewCellEventArgs) As Boolean If TypeOf DataGridView1.Columns(cellEvent.ColumnIndex) _ Is DataGridViewLinkColumn _ AndAlso Not cellEvent.RowIndex = -1 Then _ Return True Else Return False End Function Private Function IsANonHeaderButtonCell(ByVal cellEvent As _ DataGridViewCellEventArgs) As Boolean If TypeOf DataGridView1.Columns(cellEvent.ColumnIndex) _ Is DataGridViewButtonColumn _ AndAlso Not cellEvent.RowIndex = -1 Then _ Return True Else Return (False) End Function Private Function RetrieveSuperiorsLastNameCell( _ ByVal employeeId As String) As DataGridViewCell For Each row As DataGridViewRow In DataGridView1.Rows If row.IsNewRow Then Return Nothing If row.Cells(ColumnName.EmployeeId.ToString()). _ Value.ToString().Equals(employeeId) Then Return row.Cells(ColumnName.LastName.ToString()) End If Next Return Nothing End Function #Region "checkbox state" Dim inOffice As New Dictionary(Of String, Boolean) Private Sub DataGridView1_CellValuePushed(ByVal sender As Object, _ ByVal e As DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValuePushed If IsCheckBoxColumn(e.ColumnIndex) Then Dim employeeId As String = GetKey(e) If Not inOffice.ContainsKey(employeeId) Then inOffice.Add(employeeId, CType(e.Value, Boolean)) Else inOffice.Item(employeeId) = CType(e.Value, Boolean) End If End If End Sub Private Function GetKey(ByVal cell As DataGridViewCellValueEventArgs) As String Return DataGridView1.Rows(cell.RowIndex).Cells( _ ColumnName.EmployeeId.ToString()).Value().ToString() End Function Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded If IsCheckBoxColumn(e.ColumnIndex) Then Dim employeeId As String = GetKey(e) If Not inOffice.ContainsKey(employeeId) Then Dim defaultValue As Boolean = False inOffice.Add(employeeId, defaultValue) End If e.Value = inOffice.Item(employeeId) End If End Sub Private Function IsCheckBoxColumn(ByVal columnIndex As Integer) As Boolean Dim outOfOfficeColumn As DataGridViewColumn = _ DataGridView1.Columns(ColumnName.OutOfOffice.ToString()) Return (DataGridView1.Columns(columnIndex) Is outOfOfficeColumn) End Function #End Region End Class
System.Windows.Forms.DataGridViewElement
System.Windows.Forms.DataGridViewBand
System.Windows.Forms.DataGridViewColumn
System.Windows.Forms.DataGridViewComboBoxColumn
Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.