2015-01-15 54 views
0

這就是情況。 我有一個目錄更新功能:組合框仍然在禁用模式下停用項目

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); 
     } 

好了現在我有,如果你按下按鈕「犧牲」它刪除的功能

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(); 

    } 

這一切都運行完美,但如果我在庫存只有一個寵物,的確在我的組合框它刪除寵物時:從清單中,然後在ComboBox太寵物該combobx被禁用,並顯示寵物的名稱,在這種情況下,我已刪除的寵物。如果我有更多的一個寵物,然後組合框啓用(這是可以的),並顯示我擁有的其他寵物。

爲什麼如果我只有一個寵物(在組合框中的「項」)刪除時仍然刪除它的名稱?

希望你能幫助和謝謝!

尤金

回答

0

我想你應該刪除的ComboBox的選擇,以及:

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

} 
+0

感謝這一行解決問題。 (沒有addind DataSource = null) – 2015-01-15 16:44:32

+0

@EugenioOlivieri,這隻能解決/隱藏你當前的問題,但你的代碼還有其他問題需要擔心。 – Bolu 2015-01-15 16:46:29

+0

爲什麼?問題出在哪裏? – 2015-01-15 17:16:03

0

這是因爲在沒有項目的代碼將只禁用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; 
} 

此外,副作用注意:您應該在課程級別定義List<Pet> pets,以便您不需要繼續設置DataSource

第二個提示:您正在多次訂閱cboPet.SelectedIndexChanged += new System.EventHandler(cboPet_SelectedIndexChanged);,將其移出當前功能,或在註冊前取消訂閱。

+0

所以我要補充的,如果(pets.Count == 0){cboPet.Enabled = FALSE; btAttack.Enabled = false; cboPet.Datasource = null? – 2015-01-15 16:27:59

+0

哦,好吧......我讀完後再讀。我要去測試它。 – 2015-01-15 16:28:49

+0

Addng datasource = null,給我一個錯誤'System.NullReferenceException'Magicians_game.exe未在utent代碼中處理。 信息:引用一個對象不與一個對象實例相關聯。 – 2015-01-15 16:34:35