提问人:Paras 提问时间:2/20/2023 最后编辑:Paras 更新时间:2/24/2023 访问量:69
EventHandling 用于使用button_click事件加载的多个控件
EventHandling for multiple controls that are loaded using a button_click event
问:
我在表单中有一个按钮。每次单击按钮时都会加载一个组框(您可以参考我之前的问题)。每个 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));
}
先谢谢你。
答:
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;“仅适用于最后一个可用的组框中的文本框,我将考虑您的建议。但是,我如何使它也可用于以前的组框呢?
评论