Right now you are populating each combo box using all rows in the respective table. This will obviously not work very well for tables with a lot of records. You only need to show the cities that belong to state when populating the cities combo, and then you need to only load the available states for the selected country.
I assume that your database knows these relationships. I am going to talk about the city combo, but the same will apply to the states. In your table, your city data structure should know the state to which it belongs. So you would need to create a Fill method on the BO that looks something like this:
Public Sub FillCityByState(Byval StatePrimaryKey As Integer)
Me.FillDataTable("SELECT * FROM cities WHERE city_state = " & StatePrimaryKey.ToString())
End Sub
Next, you will want to change the PopulationDataSourceSettings of the city combo to use the above method. The one thing that you need to is specify the parameter StatePrimaryKey when the combo loads. To do this, capture the ListPopulating event on the city combo box. Inside that event, place code similar to this:
e.Parameters(0).Value = MyStates.State_PrimaryKey
Now you need to tell the city combo to reload when the state changes. So in the SelectedValueChanged or the SelectedIndexChanged event of the State combo box, place the following code:
MyCityCombo.Requery()
This will force the cities to repopulate based on the new state selection.
Once last thing you can do to make sure that the object populate in the correct order since they rely on one another, is set the InitializationPriority. This will ensure that order they are loaded when instantiating the form will happen in the proper order. Place a value like this on each combo:
Country Combo Initialization Priority: 25
State Combo Initialization Priority: 26
City Combo Initialization Priority: 27
Let me know if you have any questions.