Работая над небольшим приложением, которое извлекает тестовые случаи, запускает результаты из базы данных SQL Server, я столкнулся с дилеммой в моей методологии при попытке создания динамических имен контроллеров в TableLayoutPanel в WinForms. Я создаю строки динамически, когда пользователь выбирает конкретный тестовый пример, и оттуда TableLayoutPanel откроет другое окно с предварительно загруженными шагами теста и двумя переключателями, чтобы указать, прошел ли тест. Моя проблема в том, что когда я выбираю одну из переключателей справа от шага, я получаю одну и ту же консоль каждый раз. Мне нужно иметь возможность определить, какую именно радиокнопку нажал пользователь, чтобы я мог определить, в какой строке он находится, а затем, какой тест прошел или не прошел. Мой основной код выглядит следующим образом:
FormManualTest.cs (раздел при добавлении в TableLayoutPanel)
private void addRowToolStripMenuItem_Click(object sender, EventArgs anotherEvent)
{
tableLayoutTest.RowStyles.Clear(); // Clear row styles to ensure a clean start when adding to the TableLayoutPanel
List<RadioButton> listOfRadioControls = new List<RadioButton>(); // Create array of radio buttons
List<UserCustomStep> listOfStepControls = new List<UserCustomStep>(); // Create array of custom controls
for (int i = 0; i < 5; i++)
{
UserCustomStep step = new UserCustomStep(Counter, "Step: " + i + " Push the button to elicit a response."); // Creates new user custom step control instance
RadioButton pass = new RadioButton();
pass.Text = "Pass";
pass.AutoSize = true;
RadioButton fail = new RadioButton();
fail.Text = "Fail";
fail.AutoSize = true;
fail.Margin = new Padding(3,3,20,3); // Needed to see the fail button without having to scroll over
listOfStepControls.Add(step); // Add step to UserCustomStep array
listOfRadioControls.Add(pass); // Add radio buttons to the RadioButton array
listOfRadioControls.Add(fail);
listOfRadioControls[i * 2].CheckedChanged += (s, e) => // Subscribes the pass radio button to listen for when a user has clicked on it
{
Console.WriteLine("Pass " + i + " was clicked");
};
listOfRadioControls[(i * 2) + 1].CheckedChanged += (s, e) => // Subscribes the fail radio button to listen for when a user has clicked on it
{
Console.WriteLine("Fail " + i + " was clicked");
};
tableLayoutTest.Controls.Add(listOfStepControls[i], 0, i); // Adds CustomStep to first column
tableLayoutTest.Controls.Add(listOfRadioControls[i*2], 1, i); // Adds Pass Radio Button to second column
tableLayoutTest.Controls.Add(listOfRadioControls[(i * 2) + 1], 2, i); // Add Fail Raido Button to third column
Counter++; // Increment couter to add subsequent steps underneath the previous ones.
}
}
Скриншоты приложения с выводом на консоль:
После нажатия кнопки теста и нажатия кнопки переключателя
(После нажатия на эту кнопку я ожидаю, что консоль будет читать «Нажат на 1-й проход»)

Чтение консоли:

Нажмите кнопку Fail:
(Из этого рисунка ниже я знаю, что, поскольку кнопка «Пропустить» не остается нажатой, я использую один и тот же контроллер для всех 5 из них)

Консольное чтение

Итак, из всех этих проблем, с которыми я столкнулся, я знаю, что каким-то образом я использую один и тот же контроллер для всех 5 экземпляров, независимо от того, что я храню все в массиве контроллеров и получаю оттуда , Цикл for придется преобразовывать в цикл для каждого цикла позже, но это все еще не решает мою проблему. Я считаю, что если бы я мог сказать что-то вроде:
RadioButton (pass+id) = new RadioButton();
или что-то подобное во время цикла для динамического создания имени для элементов управления, тогда каждый из них будет полностью отдельным элементом управления, и я могу перейти оттуда. Любая помощь будет принята с благодарностью! Я имею опыт работы в Интернете, поэтому мои обычные навыки для исправления этого на земле JS сейчас не пригодятся. Еще раз спасибо за помощь.