繁体   English   中英

如何隐藏多个标签

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM