C#中循环动态创建Guna2TextBox时名称未按预期递增的问题
嘿,我帮你揪出问题根源啦!你的代码里有两处关键逻辑错误,导致每次点击按钮都只能生成名叫Note1的控件:
问题出在哪?
curr变量被错误重置:每次点击按钮你先让curr++,然后进入循环创建控件,但循环结束时又把curr = 0。这就导致下次点击时curr又从0开始,循环永远只执行1次(i始终是1),所以控件名称永远是Note1。- 重复创建控件的冗余逻辑:你本来想点击一次新增一个控件,但原代码每次点击都会重新“批量创建”控件,还把新控件都堆到
flowLayoutPanel1里,这会导致面板里塞满同名的Note1,完全不是你要的效果。
修复后的代码
我们简化逻辑,每次点击只新增一个控件,用curr的递增来保证名称唯一:
int curr = 0; private void guna2Button1_Click(object sender, EventArgs e) { int h_p = 170; curr++; // 直接创建单个新控件,不用多余循环 var new_note = new Guna2TextBox() { Text = "Title\n", Name = "Note" + curr, // 用curr做序号,确保名称依次是Note1、Note2... Multiline = true, AcceptsTab = true, AcceptsReturn = true, WordWrap = false, ScrollBars = ScrollBars.Vertical, Width = 220, Height = 110, BorderRadius = 8, Font = new Font("Bahnschrift", 13), ForeColor = Color.White, FillColor = ColorTranslator.FromHtml("#1E1E1E"), BorderColor = ColorTranslator.FromHtml("#2C2C2C"), // 根据curr计算位置,第一个在25,第二个在25+170,以此类推 Location = new Point(450, 25 + (curr - 1) * h_p) }; // 现在弹出的就是当前控件的正确名称啦 MessageBox.Show(new_note.Name); flowLayoutPanel1.Controls.Add(new_note); }
关键修改点说明
- 删掉了多余的循环:你的需求是点击一次加一个控件,根本不需要循环批量创建。
- 去掉了
curr = 0的重置:让curr一直递增,作为每个控件的唯一序号,保证名称不会重复。 - 调整了位置计算:用
25 + (curr - 1) * h_p直接算出每个新控件的Top值,不用每次从25开始累加,逻辑更清晰。 - 直接验证控件的
Name:现在弹窗显示的是刚创建的控件名称,而不是循环变量i,能准确看到结果。
这样改完之后,每次点击按钮都会生成一个名称依次递增的Guna2TextBox,完全符合你的预期~
内容的提问来源于stack exchange,提问作者user19335999
相关产品推荐
相关产品推荐

