C#Windows窗体-如何在组合框中获取上一个SelectedItem

C#Windows窗体-如何在组合框中获取上一个SelectedItem,c#,winforms,C#,Winforms,我目前正试图找出如何在组合框中获取上一个选定项,数据将添加到Form1_Load函数的列表中 //Flavour Change Button private void CoboFlav_SelectionChangeCommitted(object sender, EventArgs e) { var selectedItemPrice = (coboFlav.SelectedItem as Flavour).price; var select

我目前正试图找出如何在组合框中获取上一个选定项,数据将添加到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)
        {
            //Increment 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设置为-1。但我真的不明白这个解决方案。如果有人能给我指出正确的方向,那就太棒了。另外,我对windows窗体也很陌生,因为我来自Unity的背景


谢谢

显然你想要一种特殊的组合框。在“面向对象编程”课程中,您了解到,如果您希望一个类类似于另一个类,但具有某些特殊行为,则应创建一个派生类:

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?
            }
        }
    }
}
Test在虚拟测试程序或单元测试中,检查是否由
base.SelectedIndex
调用,如果不是,则在
SelectedIndex.Set
中调用它。 还要检查调用
组合框.SelectedItem.Set
时会发生什么情况。这是否会通过调用覆盖的属性SelectedIndex来更改所选索引

事件:我认为您不需要更改先前选择的事件索引。它不会添加任何内容,因为每当引发event SelectedIndexChanged时都会引发此事件,因此那些希望在先前SelectedIndexChanged发生更改时得到通知的人可以向event SelectedIndexChanged进行子贿赂


不过,如果您想要此类事件,请遵循property SelectedIndex和OnSelectedIndex Changed中使用的模式。

就组合框而言,没有以前选择的项目。您需要自己跟踪列表中所选的内容。正如@KenWhite所说,最简单的方法是每次当前所选项目更改时跟踪上一个项目,方法是使用
previousSelection
变量跟踪它。如果你需要一个历史记录,那么一个列表就可以了;如果这是您经常需要的功能,那么您可以从
组合框
派生您自己的自定义控件,它将跟踪以前的选择并将此数据作为属性公开。您应该创建一个单独的
列表
,以添加/删除不同的项。那么总数和计数就很容易了。比如
CurrentTotal.Text=selList.Sum(x=>x.price.ToString()