2014-12-17 2 views
0

Прежде всего им жаль мой английский. Я начинающий программист в C#, используя VS Express 2013.ComboBox item return index

Это моя простая проблема, я думаю: У меня есть combobox (cboMantello) с двумя элементами внутри. Затем у меня есть кнопка, которая использует атрибуты выбранного элемента и добавляет их в мои персонажи. Другая кнопка удаляет эти атрибуты.

Чтобы избежать спама первой кнопки, я отключил ее, а также установите для параметра combobox.enabled значение false. В этот момент возникает проблема. При отключении combobox он возвращается к первому элементу в списке, поэтому, если я выбираю второй элемент и нажимаю кнопку «equipe», он добавляет атрибуты, но затем переключается на первый элемент. Так что, если я нажму «remove» ", код удаляет атрибуты первого элемента.

Я не знаю, как сообщать combobox, чтобы вырезать второй элемент во время включенной = ложной фазы.

Благодарим за помощь и снова просим за мои грамматические «ужасы»!

Heres мой код:

private void UpdateListaMantelliInventarioUI() 
{ 
    List<Mantello> mantelli = new List<Mantello>(); 

    foreach (OggettoInventario oggettoInventario in _player.Inventario) 
    { 
     if (oggettoInventario.Dettagli is Mantello) 
     { 
      if (oggettoInventario.Quantità > 0) 
      { 
       mantelli.Add((Mantello)oggettoInventario.Dettagli); 
      } 
     } 
    } 

    if (mantelli.Count == 0) 
    { 
     cboMantello.Enabled = false; 
    } 
    else 
    { 
     cboMantello.DataSource = mantelli; 
     cboMantello.DisplayMember = "Nome"; 
     cboMantello.ValueMember = "ID"; 

     cboMantello.SelectedIndex = 0; 
    } 
} 

private void btMantello_Click(object sender, EventArgs e) 
{ 
    Mantello mantellocorrente = (Mantello)cboMantello.SelectedItem; 

    _player.DifesaMagica = (_player.DifesaMagica + mantellocorrente.AggiungeDifesaMagica); 
    lblVesteDifesa.Text = "(+" + mantellocorrente.AggiungeDifesaMagica.ToString() + ")"; 
    toolTip1.SetToolTip(lblVesteDifesa, mantellocorrente.Nome.ToString()); 

    _player.Mana = (_player.Mana + mantellocorrente.AggiungeMana); 
    lblVesteMana.Text = "(+" + mantellocorrente.AggiungeMana.ToString() + ")"; 
    toolTip1.SetToolTip(lblVesteMana, mantellocorrente.Nome.ToString()); 

    _player.Evasione = (_player.Evasione + mantellocorrente.AggiungeEvasione); 
    lblVesteEvasione.Text = "(+" + mantellocorrente.AggiungeEvasione.ToString() + ")"; 
    toolTip1.SetToolTip(lblVesteEvasione, mantellocorrente.Nome.ToString()); 


    btMantello.Enabled = false; 
    btTogliMantello.Enabled = true; 
    cboMantello.Enabled = false; 

    UpdatePlayerStats(); 
    UpdateListaMantelliInventarioUI(); 
} 

private void btTogliMantello_Click(object sender, EventArgs e) 
{ 
    Mantello mantellocorrente = (Mantello)cboMantello.SelectedItem; 
    if (btMantello.Enabled == false) 
    { 
     btTogliMantello.Enabled = true; 
     _player.DifesaMagica = (_player.DifesaMagica - mantellocorrente.AggiungeDifesaMagica); 

     lblVesteDifesa.Text = ""; 
     _player.Mana = (_player.Mana - mantellocorrente.AggiungeMana); 

     lblVesteMana.Text = ""; 
     _player.Evasione = (_player.Evasione - mantellocorrente.AggiungeEvasione); 

     lblVesteEvasione.Text = ""; 

     UpdatePlayerStats(); 

     btMantello.Enabled = true; 
     cboMantello.Enabled = true; 
    } 

    btTogliMantello.Enabled = false; 
} 
+0

Это не нормальное поведение. Отключение ComboBox не должно изменять выбранный элемент. –

+0

Я знаю ... не знаю почему это происходит. –

+0

Возможно, потому что после его отключения вы вызываете 'UpdateListaMantelliInventarioUI()' и обновляете 'DataSource'? –

ответ

1

Причина Combo Box сбрасывает потому, что вы изменяете его содержимое при вызове UpdateListaMantelliInventarioUI() в случае щелчка для bntMantello, в частности линии cboMantello.DataSource = mantelli; и cboMantello.SelectedIndex = 0;.

Некоторые варианты для рассмотрения:

  • Нужно обновить поле со списком после клика оснащать/при снятии?
  • Если есть, вы можете либо добавить/удалить из cboMantello.Items напрямую.
  • Вы также можете получить SelectedIndex/Item от cboMantello, прежде чем обновлять его. После того, как вы обновите cboMantello, вы можете перебрать элементы и обновить SelectedIndex/Item.

Некоторый код:

private void UpdateListaMantelliInventarioUI() 
{ 
    var previousSelection = cboMantello.SelectedItem; 

    ... 

    else 
    { 
     ... 

     if (cboMantello.Items.Contains(previousSelection)) 
      cboMantello.SelectedItem = previousSelection; 
     else 
      cboMantello.SelectedIndex = 0; 
    } 
} 
+0

Черт, ты прав. Не обязательно обновлять список. Теперь я удалил это, и все работает отлично. Еще раз спасибо! РЕШИТЬ! –

+0

@EugenioOlivieri Рад, что я мог помочь! Кстати, вы могли бы проверить этот ответ как «Принято»? : D – tehDorf

+0

Готово! THX снова! –