如何隐藏多个标签

时间:2010-10-28 17:01:57

标签: c# stack label

我正在堆栈,我有一个输入框,每当我输入一个数字,该数字被插入堆栈,并显示在标签中,我不断添加数字和标签,然后每当我弹出一个数字,最后创建的标签(代表堆栈)需要消失等等,直到堆栈为空。

简而言之,我在堆栈中添加了一个数字,创建了一个标签,我弹出一个数字,相应的标签就消失了。

我的问题是,每当我不断弹出数字时,唯一消失的标签是最后一个,其他标签不会消失。

让我们说这些是我的标签

8 7 6 五 4 3 2 1

我弹出8 7 6 5 ...而唯一消失的标签是最后一个,编号8

7 6 五 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个案例

由于

3 个答案:

答案 0 :(得分:0)

问题似乎是在弹出一个元素后,lblPush需要引用与堆栈上 now 最顶层项目相关联的标签,以便 next 弹出操作将隐藏正确的标签。但是我没有观察到lblPush在“pop”操作之后的重新分配,所以我假设它在当前代码中,这个变量总是指的是最后一个项被推送到堆栈上,而不是堆栈的 top 上的项目,这是我认为你需要的。

执行此操作的一种方法是将操作数与堆栈本身中的标签相关联。

例如:

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,但对于像这样的孤立问题,Tuple解决方案很好,IMO。

答案 1 :(得分:0)

类似的东西:

Controls.OfType<Label>().Where(...).ToList().ForEach(l => l.Hide());

在Where中,你应该对标签的名称有一个条件,但为此你需要给每个人一个特定的名字。

答案 2 :(得分:0)

我建议保持一堆数字和一堆Label控件,并同步他们的推/弹。或者,您可以创建一个包含数字和标签的类,并使用一个堆栈 - 这将大大减少要维护的代码量。像这样:

public class NumberLabel
{
    public int Number { get; set; }
    public Label Label { get; set; }
}

...

var stack = new Stack<NumberLabel>();