EventHandling 用于使用button_click事件加载的多个控件

EventHandling for multiple controls that are loaded using a button_click event

提问人:Paras 提问时间:2/20/2023 最后编辑:Paras 更新时间:2/24/2023 访问量:69

问:

我在表单中有一个按钮。每次单击按钮时都会加载一个组框(您可以参考我之前的问题)。每个 GroupBox 中只有很少的文本框和标签。我为groupbox中的文本框引发了keydown事件。keyDown 事件执行一些数学计算。

链接到我之前的问题:使用 button_click 事件在表单中加载多个 Groupbox

当只加载一个分组框时,它工作正常。但是,当加载第二个组框时,引发的事件对之前加载的组框中的文本框不起作用。它仅适用于新的组框。 例如 如果在加载 groupbox1 时单击该按钮,如果单击该按钮,则在第二次加载 groupbox2 时单击该按钮,依此类推...... 问题是 keydown 事件仅适用于新加载的 groupbox。(即,如果第三次单击该按钮,则 KeyDown 事件仅适用于 GroupBox3。对于 groupbox1 和 groupbox2,它不起作用) 加载新的组框时,应执行哪些操作来保留上一个组框中控件的事件。

这是我尝试过的: 但问题仍然存在。

int count;
private GroupBox GetGroupBox(int a)
        {
            groupBox = new GroupBox() { Text = "S" + (a.ToString()), Name = "S" + (a.ToString()), Width = 150, Height = 150, Location = new Point(15 + (count - 1) * (150 + 5), 270) };
                        
            for (int i=0; i<5; i++)
            {
                switch (i)
                {
                    case 1: // Add a TextBox and A Label
                        Tb1 = new TextBox() { Width = 40, Height = 10, Text = "Something", Location = new Point(75, 30) };
                        groupBox.Controls.Add(Tb1);
                        Tb1.KeyDown += Tb1_KeyDown;
                        lbl1 = new Label() { Name = "lbl1", Text = "r1.X", Width = 40, Height = 15, Location = new Point(10, 30) };
                        groupBox.Controls.Add(lbl1);
                        break;
                    case 2: // Add a TextBox and A Label
                        Tb2 = new TextBox() { Width = 40, Height = 10, Text = "Something", Location = new Point(75, 50) };
                        groupBox.Controls.Add(Tb2);
                        Tb2.KeyDown += Tb2_KeyDown;
                        lbl2 = new Label() { Name = "lbl2", Text = "r1.Y", Width = 40, Height = 15, Location = new Point(10, 50) };
                        groupBox.Controls.Add(lbl2);
                        break;
                    case 3: // Add a TextBox and A Label
                        Tb3 = new TextBox() { Width = 40, Height = 10, Text = "Something", Location = new Point(75, 70) };
                        groupBox.Controls.Add(Tb3);
                        Tb3.KeyDown += Tb3_KeyDown;
                        lbl3 = new Label() { Name = "lbl3", Text = "r1.Width", Width = 50, Height = 15, Location = new Point(10, 70) };
                        groupBox.Controls.Add(lbl3);
                        break;
                    case 4: // Add a TextBox and A Label
                        Tb4 = new TextBox() { Width = 40, Height = 10, Text = "Something", Location = new Point(75, 90) };
                        groupBox.Controls.Add(Tb4);
                        Tb4.KeyDown += Tb4_KeyDown;
                        lbl4 = new Label() { Name = "lbl4", Text = "r1.Height", Width = 50, Height = 15, Location = new Point(10, 90) };
                        groupBox.Controls.Add(lbl4);
                        break;
                }
            }            
            return groupBox;
        }
private void Tb4_KeyDown(object sender, KeyEventArgs e)
        {
            // / call a method to do something using the Tb.text as argument
        }
private void Tb3_KeyDown(object sender, KeyEventArgs e)
        {
            // / call a method to do something using the Tb.text as argument
        }
private void Tb2_KeyDown(object sender, KeyEventArgs e)
        {
            // / call a method to do something using the Tb.text as argument
        }
private void Tb1_KeyDown(object sender, KeyEventArgs e)
        {
            // call a method to do something using the Tb.text as argument
        }
private void button1_Click(object sender, EventArgs e)
        {
            this.Controls.Add(GetGroupBox(++count));            
        }

先谢谢你。

C# .NET WinForms 事件 GroupBox

评论

0赞 Jazz. 2/21/2023
什么不起作用?

答:

0赞 Jazz. 2/22/2023 #1

从您的描述和代码中,缺少很多东西:

  • 你有单一的表格吗?为什么每次都创建一个新的 Form1()?
  • 如何使用 TextBox 创建这些数组?你能添加那个代码吗?你要带groupbox Childs吗?我的直觉说不。
  • 在代码中将 += 赋值到什么位置?从您提到的行为来看,我认为您只能以某种方式将 += 分配给您手头的最后一个可用 groupbox 实例。

似乎您的问题是您正在创建一个新组,并且可能稍后将其转换为表单。如果是这种情况,可以在 GetGroupbox 方法中调用 +=。 另一种方法是在 GetGroupBox 期间将所有 TextBox 实例添加到列表中,然后执行 +=。

现在,你的 foreach 很糟糕。您正在迭代 tbx1,在这种情况下 tbx2 是什么?

我建议你学习调试(通过断点)和评估你的代码行为。这将加强您的编码。

评论

0赞 Jazz. 2/22/2023
我无法编辑我的答案,因为编辑太多,而且元素的位置似乎是绝对的:group1 textbox1 将与 group2 textbox1 位于同一位置。您还应该考虑这一点。
0赞 Paras 2/22/2023
CreateGroupBox() 方法返回一个带有文本框和标签的组框。我从 buttonclick 事件调用此方法。因此,每次单击按钮时,我都会得到一个组框。
0赞 Jazz. 2/22/2023
你能回答其余的问题并添加代码吗?
0赞 Paras 2/23/2023
我不是每次都创建一个新表单。我只有一个表单(Form1),
0赞 Paras 2/23/2023
我不是每次都创建一个新表单。我只有一个表单(Form1),为了创建数组,我只需使用 textbox[] 语法并将 tbx1,tbx2 添加到数组中。TBX1 中。每次单击按钮时,名称都会更改。定义文本框后,我立即使用了 tbx1。KeyDown += Tbx1_KeyDown;是的。这个“TBX1.KeyDown += Tbx1_KeyDown;“仅适用于最后一个可用的组框中的文本框,我将考虑您的建议。但是,我如何使它也可用于以前的组框呢?