Событие SelectedIndexChanged
наступает всякий раз, когда выбранный индекс изменяется программно или пользователем.
Как указывает Давиде Пирса, когда вы изменяете DataSource из cmBxCity, вы программно изменяете выбранный индекс,следовательно, вызывая событие cmBxCity.SelectedIndexChanged в этой строке:
cmBxCity.DataSource = city;//Here he ran the second function, why?
Одно из возможных решений - использовать вместо этого событие SelectionChangeCommitted
, которое вызывается только для изменений, внесенных пользователем.