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.
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.








