我想在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;
然后根据之前添加的标签删除标签,请分享!
答案 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);
}