Создание имен динамических контроллеров в C # с WinForms для TableLayoutPanel - PullRequest
0 голосов
/ 07 мая 2018

Работая над небольшим приложением, которое извлекает тестовые случаи, запускает результаты из базы данных 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-й проход») Screenshot of App when Steps have been loaded in and Pass radio button has been clicked

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

Console Read

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

Fail Button Pressed

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

enter image description here

Итак, из всех этих проблем, с которыми я столкнулся, я знаю, что каким-то образом я использую один и тот же контроллер для всех 5 экземпляров, независимо от того, что я храню все в массиве контроллеров и получаю оттуда , Цикл for придется преобразовывать в цикл для каждого цикла позже, но это все еще не решает мою проблему. Я считаю, что если бы я мог сказать что-то вроде:

RadioButton (pass+id) = new RadioButton(); 

или что-то подобное во время цикла для динамического создания имени для элементов управления, тогда каждый из них будет полностью отдельным элементом управления, и я могу перейти оттуда. Любая помощь будет принята с благодарностью! Я имею опыт работы в Интернете, поэтому мои обычные навыки для исправления этого на земле JS сейчас не пригодятся. Еще раз спасибо за помощь.

1 Ответ

0 голосов
/ 07 мая 2018

Свойство Name является необязательным, его не нужно указывать и оно не должно быть уникальным. Вы можете использовать свойство Tag для своих собственных целей (вы можете назначить там ID или экземпляр события какого-либо объекта).

Однако вы также можете создать свой собственный элемент управления / usercontrol, который инкапсулирует всю строку, и вы можете объявить свои собственные свойства именно для вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...