【问题标题】:Creating Dynamic Controller Names in C# with WinForms for TableLayoutPanel在 C# 中使用 WinForms 为 TableLayoutPanel 创建动态控制器名称
【发布时间】:2018-05-07 20:09:51
【问题描述】:

在开发一个从 SQL Server 数据库中提取测试用例、运行和结果的小型应用程序时,我在尝试在 WinForms 的 TableLayoutPanel 中创建动态控制器名称的方法中遇到了两难境地。当用户选择特定的测试用例时,我正在动态创建行,然后 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”)

控制台阅读:

点击失败按钮: (我从下面的这张图片中知道,由于 Pass 按钮没有保持点击状态,我以某种方式对所有 5 个控制器使用相同的控制器)

控制台阅读

因此,从我遇到的所有这些问题中,我知道我以某种方式对所有 5 个实例使用相同的控制器,而不管我将所有内容存储在控制器数组中并从那里抓取的事实. for 循环稍后必须转换为 for each 循环,但这仍然不能解决我的问题。我相信如果我可以这样说:

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

或类似的东西,同时循环通过动态创建控件的名称,然后每个将是一个完全独立的控件,我可以从那里开始。任何帮助将不胜感激!我来自一个沉重的网络背景,所以我在 JS 领域解决这个问题的正常技能目前还没有派上用场。再次感谢您的帮助。

【问题讨论】:

    标签: c# .net winforms visual-studio


    【解决方案1】:

    Name 属性是可选的,您不需要指定它,也不需要是唯一的。您可以将属性 Tag 用于您自己的目的(您可以在那里分配某个对象的 ID 或事件实例)。

    但是,您也可以创建自己的控件/用户控件来封装整行,并且可以完全根据您的目的声明自己的属性。

    【讨论】:

    • 感谢您的评论!我在第一列中使用了带有“步骤”标签的自定义控制器,最后用您的建议封装了整行。第一次工作就像一个魅力。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多