Cascading ComboBox In Winforms Windows Forms C# VB.NET

This example explains How To Create Cascading ComboBox Dependent On One Another In WinForms Windows Forms Applications Using C# And VB.Net.


I have used Country, State, City tables from database to populate respective cascading combobox based on selection of country and state.


Drag 3 combobox controls from toolbar on the windows form, write following code to populate comboboxes.

Table schemas are shown below.

Cascading Combobox In Winforms Windows Forms C# VB



Write connection string in app.config file
<configuration>
<connectionStrings>
<add name="connectionString"
     connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Cascading.mdf;Integrated Security=True;User Instance=True"
     providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>


Bind Country ComboBox when Form loads
using System;
using System.Data;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;

namespace CascadingComboBox
{
    public partial class Form1 : Form
    {
        string strConn = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            FillCountry();
        }
        private void FillCountry()
        {
            SqlConnection con = new SqlConnection(strConn);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT CountryID, CountryName FROM Country";
            DataSet objDs = new DataSet();
            SqlDataAdapter dAdapter = new SqlDataAdapter();
            dAdapter.SelectCommand = cmd;
            con.Open();
            dAdapter.Fill(objDs);
            con.Close();
            cmbCountry.ValueMember = "CountryID";
            cmbCountry.DisplayMember = "CountryName";
            cmbCountry.DataSource = objDs.Tables[0];
        }
    }
}


Populate State and City combobox in SelectedIndexChanged event of country,State combobox based on selected IDs
private void cmbCountry_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbCountry.SelectedValue.ToString() != "")
            {
                int CountryID = Convert.ToInt32(cmbCountry.SelectedValue.ToString());
                FillStates(CountryID);
                cmbCity.SelectedIndex = 0;
            }
        }

        private void FillStates(int countryID)
        {
            SqlConnection con = new SqlConnection(strConn);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT StateID, StateName FROM State WHERE CountryID =@CountryID";
            cmd.Parameters.AddWithValue("@CountryID", countryID);
            DataSet objDs = new DataSet();
            SqlDataAdapter dAdapter = new SqlDataAdapter();
            dAdapter.SelectCommand = cmd;
            con.Open();
            dAdapter.Fill(objDs);
            con.Close();
            if (objDs.Tables[0].Rows.Count > 0)
            {
                cmbState.ValueMember = "StateID";
                cmbState.DisplayMember = "StateName";
                cmbState.DataSource = objDs.Tables[0];
            }
            
        }

        private void cmbState_SelectedIndexChanged(object sender, EventArgs e)
        {
            int StateID = Convert.ToInt32(cmbState.SelectedValue.ToString());
            FillCities(StateID);
        }

        private void FillCities(int stateID)
        {
            SqlConnection con = new SqlConnection(strConn);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT CityID, CityName FROM City WHERE StateID =@StateID";
            cmd.Parameters.AddWithValue("@StateID", stateID);
            DataSet objDs = new DataSet();
            SqlDataAdapter dAdapter = new SqlDataAdapter();
            dAdapter.SelectCommand = cmd;
            con.Open();
            dAdapter.Fill(objDs);
            con.Close();
            if (objDs.Tables[0].Rows.Count > 0)
            {
                cmbCity.DataSource = objDs.Tables[0];
                cmbCity.DisplayMember = "CityName";
                cmbCity.ValueMember = "CItyID";

            }

        }


VB.NET CODE
Private Sub Form1_Load(sender As Object, e As EventArgs)
 FillCountry()
End Sub
Private Sub FillCountry()
 Dim con As New SqlConnection(strConn)
 Dim cmd As New SqlCommand()
 cmd.Connection = con
 cmd.CommandType = CommandType.Text
 cmd.CommandText = "SELECT CountryID, CountryName FROM Country"
 Dim objDs As New DataSet()
 Dim dAdapter As New SqlDataAdapter()
 dAdapter.SelectCommand = cmd
 con.Open()
 dAdapter.Fill(objDs)
 con.Close()
 cmbCountry.ValueMember = "CountryID"
 cmbCountry.DisplayMember = "CountryName"
 cmbCountry.DataSource = objDs.Tables(0)
End Sub

Private Sub cmbCountry_SelectedIndexChanged(sender As Object, e As EventArgs)
 If cmbCountry.SelectedValue.ToString() <> "" Then
  Dim CountryID As Integer = Convert.ToInt32(cmbCountry.SelectedValue.ToString())
  FillStates(CountryID)
  cmbCity.SelectedIndex = 0
 End If
End Sub

Private Sub FillStates(countryID As Integer)
 Dim con As New SqlConnection(strConn)
 Dim cmd As New SqlCommand()
 cmd.Connection = con
 cmd.CommandType = CommandType.Text
 cmd.CommandText = "SELECT StateID, StateName FROM State WHERE CountryID =@CountryID"
 cmd.Parameters.AddWithValue("@CountryID", countryID)
 Dim objDs As New DataSet()
 Dim dAdapter As New SqlDataAdapter()
 dAdapter.SelectCommand = cmd
 con.Open()
 dAdapter.Fill(objDs)
 con.Close()
 If objDs.Tables(0).Rows.Count > 0 Then
  cmbState.ValueMember = "StateID"
  cmbState.DisplayMember = "StateName"
  cmbState.DataSource = objDs.Tables(0)
 End If

End Sub

Private Sub cmbState_SelectedIndexChanged(sender As Object, e As EventArgs)
 Dim StateID As Integer = Convert.ToInt32(cmbState.SelectedValue.ToString())
 FillCities(StateID)
End Sub

Private Sub FillCities(stateID As Integer)
 Dim con As New SqlConnection(strConn)
 Dim cmd As New SqlCommand()
 cmd.Connection = con
 cmd.CommandType = CommandType.Text
 cmd.CommandText = "SELECT CityID, CityName FROM City WHERE StateID =@StateID"
 cmd.Parameters.AddWithValue("@StateID", stateID)
 Dim objDs As New DataSet()
 Dim dAdapter As New SqlDataAdapter()
 dAdapter.SelectCommand = cmd
 con.Open()
 dAdapter.Fill(objDs)
 con.Close()
 If objDs.Tables(0).Rows.Count > 0 Then
  cmbCity.DataSource = objDs.Tables(0)
  cmbCity.DisplayMember = "CityName"

  cmbCity.ValueMember = "CItyID"
 End If

End Sub


Build and run the application.

ComboBox In Winforms C# VB.NET Cascading Dependent on one another


Download Sample Code


If you like this post than join us or share

Find More Articles