winforms 动态创建的控件名称不会通过循环增加其值C#

neskvpey  于 2022-11-17  发布在  C#
关注(0)|答案(2)|浏览(151)

我正在做一个个人项目,我正在构建一个笔记生成器,每次单击按钮时都会动态创建这个TextBox,它工作得很好,就像我预期的那样,但是当我试图通过使用循环Name = "Note" + i(其中i是循环变量)将每个TextBox命名为不同的名称时,事情变得很奇怪。
因此,我期望发生的情况是,每个TextBox名称都类似于Note1Note2Note3 ...,但当我在用于生成TextBox的同一个循环中将每个TextBox名称检索到MessageBox时,MessageBox会引发以下错误:而不是Note 1Note 1Note 1 ...

int curr = 0;
private void guna2Button1_Click(object sender, EventArgs e) {
    int top = 25;
    int h_p = 170;
    curr++;
    for(int i=1; i<curr+1; i++) {
        // Notes
        var new_note = new Guna2TextBox() {
            Text = "Title\n",
            Name = "Note" + i,
            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"),
            Location = new Point(450,top)
        };

        MessageBox.Show(i.ToString());

        top += h_p;
        flowLayoutPanel1.Controls.Add(new_note);
        curr = 0;
    }
}
wvyml7n5

wvyml7n51#

这个问题是由于在循环中您总是将Curr设置回零而引起的。并且根本不需要循环,因为您希望在每次单击时添加一个文本框。因此,您只需要查看FlowLayoutPanel的Count属性,并使用该值来准备名称。
要解决的另一个问题是如何在面板中定位下一个控件,但同样,您可以使用Count属性轻松地进行计算

private void guna2Button1_Click(object sender, EventArgs e) 
{
    int nextTop = 25 + (flowLayoutPanel.Controls.Count * 170);
    var new_note = new Guna2TextBox() {
        Text = "Title\n",
        Name = "Note" + flowLayoutPanel.Controls.Count + 1,
        .....
        Location = new Point(450,nextTop)
    };
    flowLayoutPanel1.Controls.Add(new_note);
}
c9qzyr3d

c9qzyr3d2#

我认为在这种情况下不需要使用For循环,只需要为每个文本框使用变量curr即可,因此可以使用以下代码代替For循环:

int top = 25;
int h_p = 170;
curr++;
var new_note = new Guna2TextBox() {
    Text = "Title\n",
    Name = "Note" + curr,
    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"),
    Location = new Point(450,top)
    
    top += h_p;
    flowLayoutPanel1.Controls.Add(new_note);
};

相关问题