Как скрыть несколько ярлыков - PullRequest
1 голос
/ 28 октября 2010

Я делаю стек, у меня есть поле ввода, каждый раз, когда я ввожу число, это число вставляется в стек и отображается в метке, я продолжаю добавлять числа и метки, затем, когда я выталкиваю число,последний созданный ярлык (представляющий стек) должен исчезнуть и так далее до тех пор, пока стек не станет пустым.

Короче говоря, я добавляю число в стек, создается ярлык, выскакиваю число, соответствующий ярлыкисчезает.

Моя проблема в том, что всякий раз, когда я продолжаю выскакивать номера, единственные ярлыки, которые исчезают, это последние, остальные не исчезают.

8 7 6 5 4 3 2 1

I pop 8 7 6 5 ... и единственный ярлык, который исчезает - последний, номер 8

7 6 5 4 32 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 голосов
/ 28 октября 2010

Что-то вроде:

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

В поле Где у вас должно быть условие над названием ярлыка, но для этого вам нужно дать каждому конкретное имя.

0 голосов
/ 28 октября 2010

Я бы рекомендовал поддерживать как стек чисел, так и стек Label элементов управления, а также синхронизировать их нажатия / всплывающие окна. Кроме того, вы можете создать класс, который будет содержать как число, так и метку, и просто использовать один стек - это значительно уменьшит объем поддерживаемого кода. Примерно так:

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

...

var stack = new Stack<NumberLabel>();
0 голосов
/ 28 октября 2010

Проблема заключается в том, что после того, как вы извлекаете элемент, lblPush должен ссылаться на метку, связанную с now самым верхним элементом в стеке, так что При следующей операции pop будет скрыта правильная метка.Но я не наблюдаю переназначения lblPush после операции «pop», поэтому я предполагаю, что в текущем коде эта переменная всегда ссылается на последний элемент push в стек, а не на элемент в 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.

...