2014-12-17 2 views
0

먼저 내 영어로 죄송합니다. 내 초급 프로그래머는 C#에서 VS Express 2013을 사용합니다.ComboBox 상품 반품 색인

이것은 내 간단한 문제입니다. 내부에 두 개의 항목이있는 콤보 박스 (cboMantello)가 있습니다. 그런 다음 선택한 항목의 속성을 사용하는 버튼이 있고이를 내 캐릭터 통계에 추가합니다. 다른 단추는 해당 특성을 제거합니다.

사용자가 첫 번째 스팸 메일을 스팸하지 않도록하려면 내 combobox.enabled를 false로 설정하십시오. 이 시점에서 문제가 발생합니다. 콤보 박스를 비활성화하면 목록의 첫 번째 항목을 반환하므로 두 번째 항목을 선택하고 "equipe"단추를 누르면 속성이 추가되지만 콤보 상자가 첫 번째 항목으로 전환됩니다. 그래서 "remove "버튼을 누르면 코드가 첫 번째 항목 속성을 제거합니다.

나는 enabled = false 단계에서 두 번째 항목에서 frezze하는 방법을 알지 못합니다.

도움을 주셔서 감사 드리며, 저의 문법적 "공포"에 다시 한번 감사드립니다!

Heres는 내 코드 : 당신이 bntMantello의 클릭 이벤트에 UpdateListaMantelliInventarioUI()를 호출 할 때 특별히 라인 cboMantello.DataSource = mantelli;cboMantello.SelectedIndex = 0;, 그 내용을 변경하기 때문에 콤보 상자가 재설정됩니다

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

이유입니다.

일부 옵션은 고려해야 할

  • 그들이/돌리는 것이를 장착 클릭 한 후 콤보 상자를 업데이트 할 필요가 있습니까?
  • 그렇다면 cboMantello.Items에서 직접 추가/제거 할 수 있습니다.
  • 업데이트하기 전에 SelectedIndex/ItemcboMantello에서 가져올 수도 있습니다. 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! –