В настоящее время я пытаюсь понять, как получить предыдущий выбранный элемент в поле со списком, данные добавляются в список в функции Form1_Load.

  //Flavour Change Button
    private void CoboFlav_SelectionChangeCommitted(object sender, EventArgs e)
    {
        var selectedItemPrice = (coboFlav.SelectedItem as Flavour).price;
        var selectedItemName = (coboFlav.SelectedItem as Flavour).name;

        var pre_item = pre_selIndex = (coboFlav.SelectedItem as Flavour).price;

        //var previousItem = flavourTea_Previous_Var = (coboFlav.SelectedItem as Flavour).price;

        //Item List
        Flavour listItem1 = ListCopy.MyList2.Find(x => (x.name == "- None -"));
        Flavour listItem2 = ListCopy.MyList2.Find(x => (x.name == "Lemon"));
        Flavour listItem3 = ListCopy.MyList2.Find(x => (x.name == "Passionfruit"));
        Flavour listItem4 = ListCopy.MyList2.Find(x => (x.name == "Yogurt"));

        //Checking Base Tea Box for adding price to currentItemTotal
        if (coboFlav.Text == listItem1.name || coboFlav.Text == listItem2.name || coboFlav.Text == listItem3.name || coboFlav.Text == listItem4.name)
        {
            //Increament Item Cost Value & take away previous item cost 
            currentTotalItemCost += selectedItemPrice - pre_item;
        }


        //Update CUrrentTotal Text
        CurrentTotal.Text = currentTotalItemCost.ToString();
    }

Если пользователь выбрал параметр в поле со списком, selectedPrice int увеличивается. Я пытаюсь убрать previousItemCost, и мне сложно понять, как найти предыдущий выбранный ввод пользователя.

Я не совсем уверен, как к этому подойти, я видел, как пара других людей объявляла новый int как -1 и устанавливала для него значение SelectedIndex. Но я не совсем понимаю это решение. Было бы здорово, если бы кто-нибудь мог указать мне правильное направление. Также я новичок в формах Windows, поскольку я пришел из фона Unity.

Благодарность

2
Chris 20 Янв 2021 в 04:12

2 ответа

Лучший ответ

Очевидно, вам нужен специальный вид ComboBox. В курсе «объектно-ориентированного программирования» вы узнали, что если вам нужен класс, похожий на другой класс, но с некоторым особым поведением, вы должны создать производный класс:

class PreviousSelectedComboBox : ComboBox         // TODO: invent proper name
{
    private int previousSelectedIndex = -1;

    [System.ComponentModel.Browsable(false)]
    public virtual int PreviousSelectedIndex {get; private set;}
    {
        get => this.previousSelectedIndex;
        set => this.previousSelectedIndex = value;
    }

    [System.ComponentModel.Browsable(false)]
    public override int SelectedIndex
    {
        get => base.SelectedIndex;
        set
        {
            if (this.SelectedIndex != value)
            {
                this.PreviousSelectedIndex = this.SelectedIndex;
                base.SelectedIndex = value;

                // TODO: call OnSelectedIndexChanged?
            }
        }
    }
}

Тест . В фиктивной тестовой программе или модульном тесте проверьте, не ComboBox.OnSelectedIndexChanged вызывается base.SelectedIndex, если нет, вызовите его в SelectedIndex.Set. Также проверьте, что происходит при вызове ComboBox.SelectedItem.Set. Изменяет ли это выбранный индекс путем вызова вашего переопределенного свойства SelectedIndex?

Событие : я не думаю, что вам нужно событие PreviousSelectedIndexChanged. Он ничего не добавит, потому что это событие возникает всякий раз, когда возникает событие SelectedIndexChanged, поэтому те, кто хочет получать уведомление при изменении PreviousSelectedIndex, могут подписаться на событие SelectedIndexChanged.

Тем не менее, если вам нужно такое событие, следуйте шаблону, который используется в свойстве SelectedIndex и в OnSelectedIndexChanged.

2
Harald Coppoolse 20 Янв 2021 в 07:45

Определить ранее выбранный ... У вас есть CurrentSelectedItem, который задается CurrentSelectedIndex с такими элементами управления. Когда CurrentItem изменяется, источник действия должен быть откуда-то, верно? например кнопку вверх или вниз или некоторую главную кнопку, которая вызвала оператора на элементе управления для выполнения последующего желаемого действия ...

Если вы используете мышь, вы можете вычислить текущий элемент с координатами itz на экране, и тогда предыдущий будет текущим, а следующий - тем, чья позиция была только что вычислена, и теперь вы просто должны установить выбранный индекс / элемент по желанию.

Если у вас есть дополнительные вопросы, дайте им знать.

-1
3 revs 20 Янв 2021 в 02:40