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;
}
情况是这样的。 我有库存更新功能:
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;
}