Взаимосвязь между несколькими comboBox и массивами
Имеются:
- Форма, на ней 3 ComboBox - comboBox1, comboBox2, comboBox3;
- 3 многомерных string массивов - s1, s2, s3.
Задача, привязать массивы к ComboBox, так чтобы от выбора в comboBox1 из доступных значений добавленных с массива s1 - в comboBox2 добавились значения с массива s2, но привязанные именно к тому пункту, который выбран в comboBox1, а от выбора уже в comboBox2 в comboBox3 добавились значения из s3 также привязанные значениям в comboBox2.
String[] s1 = new String[] { "Архитектура", "Конструктив", "Сети", "Общего назначения" };
String[][] s2 = new String[][]
{
new String[] {"Двери", "Окна", "Витражи", "Стена", "Пол"},
new String[] {"Балка", "Колонна", "Стена", "Фундамент", "Арматура"},
new String[] {"Воздуховод", "Соединительные детали", "Арматура воздуховода", "Механическое оборудование", "Соединительные детали трубопровода", "Гибкий трубопровод", "Сантихнический прибор", "Сплинкер", "Провод", "Кабельный лоток", "Короб", "Соединительные детали кабельного лотка", "Соединительные детали короба", "Электрооборудование", "Электроприборы", "Осветительный прибор" },
new String[] {"Аннотационные обозначения" }
};
String[][] s3 = new String[][]
{
//Архитектурные элементы
new String[] {"Дверь одностворчатая", "Дверь двустворчатая"},
new String[] {"Окно однополое", "Окно двуполое"},
new String[] {"Витраж" },
new String[] {"Стена гипсокартонная", "Стена кирпичная" },
new String[] {"Пол типовой", "Пол с закладными" },
//Конструктивные элементы
new String[] {"Балка металлическая Уголок", "Балка металлическая Швеллер", "Балка металлическая Двутавр", "Балка желозобетонная Прямоугольная", "Балка желозобетонная Тавровая", "Балка желозобетонная Двутавровая", "Балка желозобетонная Трапециевидная" },
new String[] {"Колонна металлическая ", "Колонна металлическая " },
new String[] {"Стена базовая", "Стена фундамент" },
new String[] {"Фундамент плита", "Фундамент ленточный", "Фундамент столбчатый" },
new String[] {"Форма арматурного стержня" },
//Элементы сетей
new String[] {"Воздуховод1", "Воздуховод2", "Воздуховод3" },
new String[] { "Соединительные детали1", "Соединительные детали2","Соединительные детали3" },
new String[] {"Арматура воздуховода1", "Арматура воздуховода2", "Арматура воздуховода3"},
new String[] {"Механическое оборудование1", "Механическое оборудование2", "Механическое оборудование3" },
new String[] {"Соединительные детали трубопровода1", "Соединительные детали трубопровода2", "Соединительные детали трубопровода3"},
new String[] {"Гибкий трубопровод1", "Гибкий трубопровод2", "Гибкий трубопровод3"},
new String[] {"Сантихнический прибор1", "Сантихнический прибор2", "Сантихнический прибор3"},
new String[] {"Сплинкер1", "Сплинкер2", "Сплинкер3"},
new String[] {"Провод1", "Провод2", "Провод3"},
new String[] {"Кабельный лоток1", "Кабельный лоток2", "Кабельный лоток3"},
new String[] {"Короб1", "Короб2","Короб3"},
new String[] {"Соединительные детали кабельного лотка1", "Соединительные детали кабельного лотка2", "Соединительные детали кабельного лотка3"},
new String[] {"Соединительные детали короба1", "Соединительные детали короба2", "Соединительные детали короба3"},
new String[] {"Электрооборудование1", "Электрооборудование2", "Электрооборудование3"},
new String[] { "Осветительный прибор1", "Осветительный прибор2", "Осветительный прибор3" },
//Элементы аннотаций
new String[] {"Высотная отметка", "Заголовок разреза", "Заголовок Сетки", "Заголовок уровня", "Заголовок фрагмента", "Задняя часть разреза", "Марка двери", "Марка для нескольких материалам", "Марка зоны", "Марка изменения", "Марка изменения - Параллелограмм", "Марка ключевой пометки", "Марка лестниц", "Марка лестничного марша", "Марка лестничной опоры", "Марка лестничной площадки", "Марка материала", "Марка несущего каркаса", "Марка окна", "Марка помещения", "Марка фасада, основная часть_квадрат", "Марка фасада, основная часть_окружность", "Название вида", "Осевая линия", "Первый лист", "Первый лист - Текст", "Следущий лист - Текст", "Ссылка на вид", "Фиксированное направоение вверх" }
};
public Form1()
{
InitializeComponent();
//Заполнение Раздела
comboBox1.Items.AddRange(s1);
//Заполнение типа
comboBox2.Items.AddRange(s2);
//Заполнение категории
comboBox3.Items.AddRange(s3);
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox2.Items.Clear();
comboBox2.Items.AddRange(s2[comboBox1.SelectedIndex]);
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox3.Items.Clear();
comboBox3.Items.AddRange(s3[comboBox2.SelectedIndex]);
}
Ниже приложил скриншоты. Подскажите как сделать так, чтобы:
- При выборе в comboBox2 значений из 1-го подмассива в массиве s2, в comboBox3 попадали значения Архитектурных элементов с массива s3.
- При выборе в comboBox2 значений из 2-го подмассива в массиве s2, в comboBox3 попадали значения Конструктивных элементов с массива s3.
- При выборе в comboBox2 значений из 3-го подмассива в массиве s2, в comboBox3 попадали значения Элементов сетей с массива s3.
- При выборе в comboBox2 значений из 4-го подмассива в массиве s2, в comboBox3 попадали значения Элемелементов аннотаций с массива s3.
При выборе в comboBox2 значений из 1-го подмассива s2 - всё работает корректно

При выборе в comboBox2 значений из 2-го и далее подмассива s2 - выводит значения, как и для 1-го подмассива
Но если выбрать элементы у которых индекс уходит за те значения, которых достигают 1-ый, 2-ой и 4-й подмассивы, то он хоть и неправильно, но всё же отображает, элементы из массива s3
P.S. Понимаю, что необходимо сделать цикл с перебором в зависимости от индекса в comboBox2_SelectedIndexChanged. Добавить условный оператор, в котором провести проверку на длину подмассива или некоего индекса, дойдя до которого, цикл закончит с одним подмассивом и перейдёт на следующий подмассив, но как реализовать не понимаю

