使用 button_click 事件加载的多个控件的事件处理

问题描述 投票:0回答:1

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

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

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

这就是我的尝试:我只是在使用“+=”运算符时为每个文本框引发了 keydown 事件。但问题依然存在。

private GroupBox GetGroupBox(int a, int b, int c)
        {
            System.Windows.Forms.GroupBox gBox = new System.Windows.Forms.GroupBox();
            Form1 myObj = new Form1();
            gBox.Text = "S" + (a.ToString());
            gBox.Name = "S" + (a.ToString());
            gBox.Width = 150;
            gBox.Height = 150;
            gBox.Location = new Point(15 + (count - 1) * (gBox.Width + 10), 400);

            // Labels
            Label lb1 = new Label();
            lb1.Text = "Length";
            lb1.Width = 60;
            lb1.Height = 20;

            Label lb2 = new Label();
            lb2.Text = "Angle";
            lb2.Width = 50;
            lb2.Height = 20;

            // Textboxes
            tbx1 = new TextBox();
            tbx1.Name = "tbx" + b.ToString();
            tbx1.Width = 40;
            tbx1.Height = 10;
            tbx1.Text = "50";
            tbx1.KeyDown += Tbx1_KeyDown;
                        
            tbx2 = new TextBox();
            tbx2.Name = "tbx" + c.ToString();
            tbx2.Width = 40;
            tbx2.Height = 10;
            tbx2.Text = "45";
            tbx2.KeyDown += Tbx2_KeyDown;
            
            gBox.Controls.Add(lb1);
            lb1.Location = new Point(10, 30);
            gBox.Controls.Add(lb2);
            lb2.Location = new Point(10, 70);

            gBox.Controls.Add(tbx1);
            tbx1.Location = new Point(100, 30);
            gBox.Controls.Add(tbx2);
            tbx2.Location = new Point(100, 70);

            return gBox;
        }

在上面的尝试之后,我想如果我可以创建一个包含所有文本框的数组,那么我可以使用 foreach 循环同时为所有文本框引发一个 keydown 事件。但这也不起作用。请检查以下代码:

TextBox[] tbxs = {tbx1, tbx2 };

            foreach (TextBox tbx1 in tbxs)
            {
                tbx1.KeyDown += Tbx1_KeyDown1;
                tbx2.KeyDown += Tbx2_KeyDown1;
            }

提前谢谢你。

c# .net events controls
1个回答
0
投票

根据您的描述和代码,缺少很多东西:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.