[英]How to hide multiple labels
我正在做一个堆栈,我有一个输入框,每次输入一个数字时,该数字就会插入到堆栈中并显示在标签中,我会不断添加数字和标签,然后每当弹出一个数字时,最后一个创建的标签(代表堆栈)需要消失,依此类推,直到堆栈为空。
简而言之,我将一个数字添加到堆栈中,创建了一个标签,弹出一个数字,相应的标签消失了。
我的问题是,每当我不断弹出数字时,唯一消失的标签就是最后一个,而其他标签不会消失。
假设这些是我的标签
8 7 6 5 4 3 2 1
我弹出8 7 6 5 ...,唯一消失的标签是最后一个,数字8
7 6 5 4 3 2 1
这是我创建标签的代码
if (token != "+" && token != "-" && token != "*" && token != "/")
{
problem.push(Convert.ToDouble(token));
lstbxStack.Items.Add("Pushed: " + token);
MessageBox.Show("Pushed: " + token);
lblPush = new Label();
lblPush.BorderStyle = BorderStyle.Fixed3D;
lblPush.Location = new Point(290, labelY);
lblPush.Name = "lblPush";
lblPush.Size = new Size(100, 20);
lblPush.Text = token;
Controls.Add(lblPush);
lblPush.BringToFront();
labelY -= 21;
}
这是我隐藏标签的地方
operand2 = problem.pop();
.
.
lblPush.Hide();
operand1 = problem.pop();
.
.
lblPush.Hide();
这是在for
循环和switch
案例中
谢谢
问题似乎是,当您弹出一个元素后, lblPush
需要然后引用与堆栈中当前最顶层的项目相关联的标签,以便下一个弹出操作将随后隐藏正确的标签。 但是我没有观察到在执行“ pop”操作后lblPush
的重新分配,因此我假设在当前代码中,此变量始终引用被压入堆栈的最后一个项目,而不是指向顶部的项目。堆栈,这是我认为您需要的。
一种方法是将操作数与堆栈本身中的标签关联。
例如:
Stack<Tuple<double, Label>> problem = ..
//Push:
double operand = ..
Label label = ..
problem.Push(Tuple.Create(operand, label));
...
//Pop:
var tuple = problem.Pop();
double operand = tuple.Item1;
Label label = tuple.Item2;
label.Hide();
您当然可以依靠ControlCollection
本身中标签的顺序,但是我不建议这样做。 或者,您可以提出更多的MVC,但对于这样的孤立问题,IMO可以使用Tuple
解决方案。
就像是:
Controls.OfType<Label>().Where(...).ToList().ForEach(l => l.Hide());
在“位置”中,您应该对标签名称有一个条件,但是为此,您需要给每个标签指定一个特定的名称。
我建议您同时维护一堆数字和一堆Label
控件,并同步其推送/弹出。 或者,您可以创建一个既包含数字又包含标签的类,并且仅使用一个堆栈-这将大大减少要维护的代码量。 像这样:
public class NumberLabel
{
public int Number { get; set; }
public Label Label { get; set; }
}
...
var stack = new Stack<NumberLabel>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.