Получение измененных значений динамически создаваемых ComboBox

Рейтинг: 0Ответов: 1Опубликовано: 01.03.2023

Пишу калькулятор времени работы сотрудников и загруженности кабинетов. Программа принимает в TextBox'ы фамилии сотрудников, список которых передаёт в динамически создаваемые ComboBox'ы (количество зависит от числа рабочих дней в месяце). После нажатия на кнопку генерации ComboBox'ов список сотрудников в них уже не переопределяется (это первая, но не самая важная проблема). Когда пользователь выбирает в одном из ComboBox'ов фамилию сотрудника и нажимает кнопку обновления данных, время занятости сотрудника и кабинета переопределяется через инкремент. И вот тут - действительно серьезная проблема: если после обновления данных заменить в ComboBox'е фамилию А на В (администратор меняет одного сотрудника на другого), сработает инкремент для В, но не декремент для А. К тому же на повторный выбор сотрудника в уже занятой им ячейке тоже срабатывает инкремент. К сожалению, я ещё не изучал SQL. Подскажите, пожалуйста, есть ли способ решить проблему без обращения к базам данных.

''' // список сотрудников public List Doctors = new List { "пусто", "пусто", "пусто" };

// счётчик занятых ячеек для каждого сотрудника
    public double Dr_1_cells_count = 0.0;
    public double Dr_2_cells_count = 0.0;
    
// КНОПКА ОБНОВЛЕНИЯ СПИСКА СОТРУДНИКОВ И ДАННЫХ О НАГРУЗКЕ КАЖДОГО
    private void btn_Doctors_Click(object sender, EventArgs e)
    {
        // считывание фамилий сотрудников из текст-боксов в список персонала
        Doctors[0] = textBox6.Text;
        Doctors[1] = textBox7.Text;
                                
        // вывод времени работы сотрудников
        label5.Text = Doctors[0] + $" - {Dr_1_cells_count} часов";
        label6.Text = Doctors[1] + $" - {Dr_2_cells_count} часов";
     }

// динамическое создание ComboBox'ов
public void Generate_Cells()
    {
        for (int i = 1; i < 100; i++)
        {
            ComboBox Combo = new ComboBox();
            flowLayoutPanel1.Controls.Add(Combo);                
            foreach (string doctor in Doctors)
            {
                Combo.Items.Add(doctor); // добавление сотрудников из списка администратора в ячейки приема
            }
            Combo.SelectedIndexChanged += new System.EventHandler(TimeCounter);  // в качестве события при выборе назначена функция обсчёта времени
            flowLayoutPanel1.Controls.Add(Combo); // добавление ячейки в столбец
        }
    }

// ПРОВЕРКА СОДЕРЖИМОГО ЯЧЕЙКИ
    public void TimeCounter(object sender, System.EventArgs e)
    {

        ComboBox currentCombo = (ComboBox)sender;

        if (currentCombo.SelectedItem.ToString() == Doctors[0])
        {
            Dr_1_cells_count++;
        }
        else if (currentCombo.SelectedItem.ToString() == Doctors[1])
        {
            Dr_2_cells_count++;
        }
    }

'''

Ответы

▲ 0

Нужен словарь с ID ячеек в качестве ключей и именами сотрудников в качестве значений:

public Dictionary<string, string> Doctors_time_dict = new Dictionary<string, string>();

В этот словарь динамически записывать пары "имя ячейки" : "имя сотрудника":

Combo.Name = "Combo_" + i.ToString();  // создает идентификатор ячейки
if (Combo.SelectedItem.ToString() == Doctors[0])
{
    Doctors_time_dict[Combo.Name] = Doctors[0]; // добавляет в словарь пару "в это время" работал "этот сотрудник"                
}
else if (Combo.SelectedItem.ToString() == Doctors[1])
{
    Doctors_time_dict[Combo.Name] = Doctors[1];
}

Потом словарь можно обходить в цикле, сравнивая значение в словаре со значениями в списке сотрудников:

foreach (var person in Doctors_time_dict)
{
    if (person.Value == Doctors[0])
    {
        Dr_1_cells_count++;
    }                    
    else if (person.Value == Doctors[1])
    {
        Dr_2_cells_count++;
    }
}