ComboBox 仍在禁用模式下显示项目

ComboBox still diplaying item in disable mode

情况是这样的。 我有库存更新功能:

    public void UpdateInventoryList()
            {
                dgInventory.RowHeadersVisible = false;

                dgInventory.ColumnCount = 2;
                dgInventory.Columns[0].Name = "Name";
                dgInventory.Columns[0].Width = 112;
                dgInventory.Columns[1].Name = "Quantity";

                dgInventory.Rows.Clear();


                foreach (InventoryItem inventoryItem in _player.Inventory)
                {
                    if (invetoryItem.Quantity > 0)
                    {
                        dgInventory.Rows.Add(new[] { inventoryItem.Details.Name, inventoryItem.Quantity.ToString() });

                    }


                }

            }

然后我有一个玩家宠物组合框 :

private void UpdatePet()
        {
            List<Pet> pets = new List<Pet>();

            foreach (InventoryItem inventoryItem in _player.Inventory)
            {
                if (inventoryItem.Details is Pet)
                {
                    if (inventoryItem.Quantity > 0)
                    {
                        pets.Add((Pet)inventoryItem.Details);
                    }
                }
            }

            if (pets.Count == 0)
            {

                cboPet.Enabled = false;
                btAttack.Enabled = false;

            }
            else
            {
                cboPet.DataSource = pets;
                cboPet.DisplayMember = "Name";
                cboPet.ValueMember = "ID";

                cboPet.SelectedIndex = 0;
            }

            cboPet.SelectedIndexChanged += new System.EventHandler(cboPet_SelectedIndexChanged);
        }

好的,现在我有一个功能,如果你按下按钮 "SACRIFICE" 它会从库存中删除宠物,然后也会在 ComboBox 中删除:

 private void btSacrifice_Click(object sender, EventArgs e)
    {
        Pet currentpet = (Pet)cboPet.SelectedItem;


        if (currentpet.Sacrificable == true && _player.CurrentHP < _player.MaxHP)
        {
            foreach (InventoryItem oi in _player.Inventory)
            {
                if (oi.Details.ID == currentpet.ID)
                {
                    oi.Quantity--;

                }
                UpdateInventoryList();
            }
            if (_player.CurrentHP + currentpet.HealHP >= _player.MaxHP)
            {
                _player.CurrentHP = _player.MaxHP;
                barHP.Value = _player.CurrentHP;
                lblHp.Text = _player.CurrentHP.ToString();

                btSacrifice.Enabled = false;
                btCallPet.Enabled = false;

            }
            else
            _player.CurrentHP = (_player.CurrentHP + currentpet.currentHP);
            barHP.Value = _player.CurrentHP;
            lblHp.Text = _player.CurrentHP.ToString();

            btSacrifice.Enabled = false;
            btCallPet.Enabled = false;
        }
        else if (!currentpet.Sacrificable == true)
        {
            tboxCombat.Text += "Not Sacrificable Pet!" + Environment.NewLine;
        }



        UpdateInventoryListI();
        UpdatePet();

    }

一切都很完美,但是如果我的库存中只有一只宠物,并且在删除宠物时确定在我的组合框中,组合框将被禁用并显示宠物的名称,在这种情况下是我删除的宠物.如果我有不止一只宠物,那么组合框将启用(这没问题)并显示我拥有的另一只宠物。

为什么我只有一只宠物("item" 在组合框中)删除时仍然显示它的名字?

希望大家帮忙,谢谢!

尤金

这是因为当没有项目时你的代码只会禁用 combobox 而不会重置它 DataSource: 所以你需要像下面这样添加 cboPet.DataSource = null;:

if (pets.Count == 0)
{
   cboPet.DataSource = null;  //add this              
   cboPet.Enabled = false;
   btAttack.Enabled = false;               

}
else
{
   cboPet.DataSource = pets;
   cboPet.DisplayMember = "Name";
   cboPet.ValueMember = "ID";
   cboPet.SelectedIndex = 0;
}

此外,旁注:您可能应该在 class 级别定义 List<Pet> pets,这样您就不需要继续设置 DataSource.

还有第二个注意事项:您正在多次订阅 cboPet.SelectedIndexChanged += new System.EventHandler(cboPet_SelectedIndexChanged);,请将其移出当前功能,或者在再次注册前取消订阅。

我认为您也应该删除 ComboBox 的选择:

if (pets.Count == 0)
{
   cboPet.SelectedIndex = -1;  //remove selection             
   cboPet.Enabled = false;
   btAttack.Enabled = false;               

}