使用循环添加标签名称的简洁方法

时间:2015-07-03 00:54:20

标签: c#

我想在Windows窗体应用程序中使用C#创建两个按钮,每次按下时都会添加一个标签,另一个按钮会从表单中删除最近添加的标签。我知道有两种方法可以做到这一点,按钮不会跟踪最近添加或删除的标签。

我所知道的两种方法是:

//I used a input box here just for an example,
//however I will most likely use this is my final code.
//it can be swapped for a textbox input

label1.Text = "";
label2.Text = "";

private void btnAddNew_Click(object sender, EventArgs e)

string input1 = Interaction.InputBox = "Type contents of label:"
label1.Text = input1;

这个例子有两个我能看到的错误,第一个是它会占用大量的空间和低效的代码来使标签文本保持为空,所以它也不会显示,正如前面提到的问题,每次都是单击按钮它只会将文本更改为相同的标签,但这个例子可能更简单。

示例2包括仅手动添加和删除包含大小,位置,名称和内容的标签的方法,因此不会有任何可能未使用/不需要的标签,尽管我无法根据标签添加标签目前有或删除最先前的标签。

如果有人知道如何根据最后添加的标签添加标签,例如

label2.Position = label1.Position + 50,50;

然后根据之前添加的标签删除标签,请分享!

2 个答案:

答案 0 :(得分:2)

只需将标签添加到FlowLayoutPanel,然后让它自动为您定位。您可以使用Controls.RemoveAt():

删除最后一个
    private void btnAdd_Click(object sender, EventArgs e)
    {
        string input1 = Interaction.InputBox("Type contents of label:");
        Label lbl = new Label();
        lbl.Text = input1;
        lbl.AutoSize = true;
        flowLayoutPanel1.Controls.Add(lbl);
    }

    private void btnRemove_Click(object sender, EventArgs e)
    {
        if (flowLayoutPanel1.Controls.Count > 0)
        {
            flowLayoutPanel1.Controls.RemoveAt(flowLayoutPanel1.Controls.Count - 1);
        }
    }

答案 1 :(得分:1)

您需要某种收藏来存储标签。

您可以使用List<Label>,但由于您对上次添加到列表中的标签特别感兴趣,因此您需要Stack<Label>

堆栈可以轻松(快速)检索/删除最近添加的项目。

所以你有这样的事情:

Stack<Label> _labels = new Stack<Label>();

private void btnAddNew_Click(object sender, EventArgs e)
{
    var label = new Label();
    label.Text = "....";    // etc
    if (_labels.Any())
    {
        // _labels.Peek() gets the most recently added label,
        // without removing it from the stack.
        var lastLabel = _labels.Peek();
        // set position based on previous
        label.Left = lastLabel.Left + 50;            
        label.Top = lastLabel.Top + 50; 
    }
    else {
        // this is the first label - set start position manually
        label.Left = 50;
        label.Top = 50;
    }
    // add to stack and form
    _labels.Push(label);
    this.Controls.Add(label);
}

private void btnRemove_Click(object sender, EventArgs e)
{
    if (!labels.Any()) {
        // there are no labels!
        return;
    }
    // _labels.Pop() returns the most recently added label,
    // and removes it from the stack.
    var label = _labels.Pop();
    // remove it from the form too
    this.Controls.Remove(label);
}